Uso de la función de SQL Server en SqlExpression en la consulta de actualización

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

  •  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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top