Uso da função SQL Server em SqlExpression em consulta atualização
-
05-07-2019 - |
Pergunta
Em SubSonic, versão 2.2, o seguinte (específico para MSSQL) código falha:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
Neste ponto update.ToString()
produz uma sentença SQL perfeitamente legal:
UPDATE [dbo].[SomeTable] SET [SomeDateTime]=GETDATE()
WHERE [dbo].[SomeTable].[ID] = @ID0
update.Execute()
no entanto falha com:
{"Failed to convert parameter value from a String to a DateTime."}
at SubSonic.Update.Execute()
Existe alguma possibilidade de utilizar as funções do SQL Server em expressões?
Solução
Para o exemplo específico que você postou você poderia apenas fazer o seguinte:
SqlQuery update = new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo(DateTime.Now)
.Where(SomeTable.IdColumn).IsEqualTo(id);
Outras dicas
Ok, eu encontrei uma solução alternativa - é possível utilizar as funções do SQL Server fora do InlineQuery. O truque é que você não deve usar a versão "fortemente tipado" de SetExpression esse parâmetro usos TableColumn, mas passar cadeias nome da coluna, como este:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.Columns.SomeDateTime).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
A parte importante ser:. SomeTable.Columns.SomeDateTime
em vez de SomeTable.SomeDateTimeColumn