Utilisation de la fonction SQL Server dans SqlExpression dans la requête de mise à jour

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

  •  05-07-2019
  •  | 
  •  

Question

Dans SubSonic, version 2.2, le code suivant (spécifique à MSSQL) échoue:

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

À ce stade, update.ToString () génère une phrase SQL parfaitement légale:

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

update.Execute () échoue cependant avec:

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

Existe-t-il une possibilité d'utiliser des fonctions de serveur SQL dans les expressions?

Était-ce utile?

La solution

Pour l'exemple spécifique que vous avez posté, vous pouvez simplement procéder comme suit:

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

Autres conseils

Bien, j'ai trouvé une solution de contournement: il est possible d'utiliser des fonctions SQL Server en dehors d'InlineQuery. Le truc, c’est que vous ne devez pas utiliser " fortement typé " version de SetExpression qui utilise le paramètre TableColumn, mais transmet les chaînes de nom de colonne, comme ceci:

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

La partie importante étant: SomeTable.Columns.SomeDateTime au lieu de SomeTable.SomeDateTimeColumn . . >

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top