Использование функции SQL Server в SqlExpression в запросе на обновление
-
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
.