Использование функции SQL Server в SqlExpression в запросе на обновление - PullRequest
0 голосов
/ 16 июня 2009

В SubSonic версии 2.2 следующий (специфичный для MSSQL) код завершается ошибкой:

SqlQuery update = 
  new Update(SomeTable)
      .SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo("GETDATE()")
      .Where(SomeTable.IdColumn).IsEqualTo(id);

В этот момент update.ToString() создает совершенно законное SQL-предложение:

UPDATE [dbo].[SomeTable] SET [SomeDateTime]=GETDATE()
WHERE [dbo].[SomeTable].[ID] = @ID0

update.Execute() однако терпит неудачу с:

{"Failed to convert parameter value from a String to a DateTime."}
  at SubSonic.Update.Execute()

Есть ли возможность использовать функции SQL Server в выражениях?

Ответы [ 2 ]

3 голосов
/ 16 июня 2009

Хорошо, я нашел обходной путь - можно использовать функции SQL Server вне InlineQuery. Хитрость заключается в том, что вы не должны использовать «строго типизированную» версию SetExpression, которая использует параметр TableColumn, а передавать строки с именами столбцов, например:

SqlQuery update = 
  new Update(SomeTable)
      .SetExpression(SomeTable.Columns.SomeDateTime).IsEqualTo("GETDATE()")
      .Where(SomeTable.IdColumn).IsEqualTo(id);

Важная часть: SomeTable.Columns.SomeDateTime вместо SomeTable.SomeDateTimeColumn.

0 голосов
/ 16 июня 2009

Для приведенного вами конкретного примера вы можете просто сделать следующее:

SqlQuery update = new Update(SomeTable)
  .SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo(DateTime.Now)
  .Where(SomeTable.IdColumn).IsEqualTo(id);
...