Die Verwendung von SQL Server-Funktion in SqlExpression in Update-Abfrage
-
05-07-2019 - |
Frage
In SubSonic, Version 2.2, der folgende (MSSQL spezifisch) Code fehlschlägt:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
An diesem Punkt update.ToString()
erzeugt einen vollkommen legal SQL Satz:
UPDATE [dbo].[SomeTable] SET [SomeDateTime]=GETDATE()
WHERE [dbo].[SomeTable].[ID] = @ID0
update.Execute()
jedoch nicht mit:
{"Failed to convert parameter value from a String to a DateTime."}
at SubSonic.Update.Execute()
Gibt es eine Möglichkeit, SQL-Server-Funktionen in Ausdrücken zu verwenden?
Lösung
Für das spezielle Beispiel, das Sie gebucht haben, könnten Sie die folgende gerade tun:
SqlQuery update = new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo(DateTime.Now)
.Where(SomeTable.IdColumn).IsEqualTo(id);
Andere Tipps
Ok, ich habe eine Abhilfe gefunden - es ist möglich, SQL Server Funktionen außerhalb von InlineQuery zu verwenden. Der Trick ist, dass Sie nicht „stark typisierte“ -Version von SetExpression verwenden müssen, die Table Parameter verwendet, aber Spaltenname Zeichenfolgen übergeben, wie folgt aus:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.Columns.SomeDateTime).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
Der wichtige Teil Wesen. SomeTable.Columns.SomeDateTime
statt SomeTable.SomeDateTimeColumn