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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top