Erro com SQL Server 2008
24/08/2012 07:53
0
Olá gente,
estou usando o sql server 2008, a conexão está funcionando mas a aplicação está dando esse erro:

Error 500: Executing action [list] of controller [LembreteController] caused exception: could not execute query; SQL [select lembrete0_.id as id8_, lembrete0_.version as version8_, lembrete0_.assunto as assunto8...

-------------------

com.microsoft.sqlserver.jdbc.SQLServerException: A constant expression was encountered in the ORDER BY list, position 1.

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)

at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)

at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)

at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)

at LembreteController$_closure2.doCall(LembreteController.groovy:21)

at LembreteController$_closure2.doCall(LembreteController.groovy)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)


-------------------------------

meu DataSource:

dataSource {
pooled = true
dialect = "org.hibernate.dialect.SQLServerDialect"
driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
username = "*****"
password = "*****"

}

// environment specific settings
environments {
production {
dataSource {
dbCreate = "update"
url = "jdbc:sqlserver://<MEUENDPOINT>:1433;databaseName=<NOME_BANCO>"
}
}
}


Alguém pode me ajudar?
Valeu!
Tags: ms sql server 2008


0
Olá, Inácio.

Amigo, pode mandar como está o código no seu controller/service que dispara esse erro?


0
Claro.


class LembreteController {

static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

def index = {
redirect(action: "list", params: params)
}

def list = {
params.max = Math.min(params.max ? params.int('max') : 15, 100)

def ordem = ""
if(params.order.equals("desc")){
ordem = "DESC"
}
if(params.order.equals("asc")){
ordem = "ASC"
}

def lembreteTotal = Lembrete.executeQuery("SELECT COUNT(id) from Lembrete as l where l.pessoa.id=:usuarioId and l.pessoa.escola.id= :id",[id:Long.valueOf(session.escola_id), usuarioId:Long.valueOf(session.user.id)])

def lembreteList = Lembrete.findAll("from Lembrete as l where l.pessoa.id=:usuarioId and l.pessoa.escola.id= :id ORDER BY "+params.sort+" "+ordem,[id:Long.valueOf(session.escola_id), usuarioId:Long.valueOf(session.user.id)], params)

[lembreteInstanceList:lembreteList, lembreteInstanceTotal: lembreteTotal[0]]

}
25/08/2012 03:06


0
Ah, desculpe, esqueci de dizer que antes estava usando o mysql e funcionava perfeitamente.
25/08/2012 03:44


0
Inácio,

algumas coisas me pareceram estranhas no teu código. Seguem algumas dicas, NEM TODAS relacionadas ao erro que você relatou, ok?

1. Sugiro trocar
[id:Long.valueOf(session.escola_id), usuarioId:Long.valueOf(session.user.id)]
por
[id:session.escola_id as Long, usuarioId:session.user.id as Long]
na primeira query. Prefiro assim, pois é mais "Groovy like" e semântico, na minha opinião. Além de ficar claramente menor (sem pontos nem parênteses para a conversão).


2. Sugiro trocar
Lembrete.findAll("from Lembrete as l where l.pessoa.id=:usuarioId and l.pessoa.escola.id= :id ORDER BY "+params.sort+" "+ordem,[id:Long.valueOf(session.escola_id), usuarioId:Long.valueOf(session.user.id)], params)
por
Lembrete.findAll("from Lembrete as l where l.pessoa.id=:usuarioId and l.pessoa.escola.id= :id ORDER BY ${params.sort} ${params.order.toUpperCase()}",[id:session.escola_id as Long, usuarioId:session.user.id as Long])
na segunda query. Não entendi porque passou o params no findAll, visto que os poucos parâmetros que usou no comando você definiu explicitamente.

3. Não vejo necessidade do "if-else" sobre a ordem (vide sugestão #2). Aliás, se os "asc" e "desc" no Sqlserver não precisam estar em caixa alta, nem precisa do .toUpperCase() na sugestão #2.


0
O problema é no order by. O que está vindo nesse params.sort?
25/08/2012 14:29


0
Oi gente,
O 'params' é porque eu estou usando o sortableColumn na view, ou seja, o usuário pode escolher a forma com que o resultado será ordenado.

No 'params.sort' vem justamente o parâmetro escolhido pelo usuário para a ordenação, por exemplo o assunto ou a data do lembrete.
25/08/2012 21:49


0
Valeu galera, consegui resolver o problema com base nas dicas.
Obrigado.
29/08/2012 00:18



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto