Uso de la función de SQL Server en SqlExpression en la consulta de actualización
-
05-07-2019 - |
Pregunta
En SubSonic, versión 2.2, el siguiente código (específico de MSSQL) falla:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
En este punto, update.ToString ()
produce una oración SQL perfectamente legal:
UPDATE [dbo].[SomeTable] SET [SomeDateTime]=GETDATE()
WHERE [dbo].[SomeTable].[ID] = @ID0
update.Execute ()
sin embargo falla con:
{"Failed to convert parameter value from a String to a DateTime."}
at SubSonic.Update.Execute()
¿Hay alguna posibilidad de usar las funciones del servidor SQL en las expresiones?
Solución
Para el ejemplo específico que ha publicado, puede hacer lo siguiente:
SqlQuery update = new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo(DateTime.Now)
.Where(SomeTable.IdColumn).IsEqualTo(id);
Otros consejos
Ok, he encontrado una solución: es posible usar las funciones de SQL Server fuera de InlineQuery. El truco es que no debes usar " fuertemente tipado " versión de SetExpression que usa el parámetro TableColumn, pero pasa cadenas de nombre de columna, como esta:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.Columns.SomeDateTime).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
La parte importante es: SomeTable.Columns.SomeDateTime
en lugar de SomeTable.SomeDateTimeColumn
.