Использование функции SQL Server в SqlExpression в запросе на обновление

StackOverflow https://stackoverflow.com/questions/1000922

  •  05-07-2019
  •  | 
  •  

Вопрос

В 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 в выражениях?

Это было полезно?

Решение

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

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

Другие советы

Хорошо, я нашел обходной путь - можно использовать функции 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top