2009-06-16 6 views
0

Dans subsonique, version 2.2, le code suivant (MSSQL spécifique) échoue:Utilisation de la fonction SQL Server dans SqlExpression dans Update requête

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

À ce stade update.ToString() produit une phrase SQL parfaitement légal:

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() 

Est-ANY possibilité d'utiliser les fonctions du serveur sql dans les expressions?

Répondre

0

Pour l'exemple précis que vous avez posté, vous pouvez simplement faire ce qui suit:

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

Merci pour la réponse rapide :) Le problème est que j'ai besoin de l'horodatage du serveur de base de données dans l'expression. En fait, je fais un peu d'arithmétique d'horodatage, et comme il semble que InlineQuery semble être ma seule option pour le moment. Ou une opération en deux étapes en transcation, je peux obtenir ma valeur par un SQL séparé (cela fonctionne): DateTime dt = new InlineQuery(). ExecuteScalar (String.Format ("SELECT DATEADD (seconde, {0}, GETDATE ()) ", Math.Abs ​​(timeout))); –

3

Ok, je l'ai trouvé une solution - il est possible d'utiliser les fonctions SQL Server en dehors de InlineQuery. L'astuce est que vous ne devez pas utiliser la version de SetExpression « fortement typé » qui utilise le paramètre TableColumn, mais passer des chaînes de nom de colonne, comme ceci:

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

L'important étant: SomeTable.Columns.SomeDateTime au lieu de SomeTable.SomeDateTimeColumn.

+0

Jamais pensé à essayer ça! Merci! –

Questions connexes