Utilisation de la fonction SQL Server dans SqlExpression dans la requête de mise à jour
-
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?
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
. . >