Utilizzo della funzione SQL Server in SqlExpression nella query di aggiornamento
-
05-07-2019 - |
Domanda
In SubSonic, versione 2.2, il seguente codice (specifico per MSSQL) ha esito negativo:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
A questo punto update.ToString ()
produce una frase SQL perfettamente legale:
UPDATE [dbo].[SomeTable] SET [SomeDateTime]=GETDATE()
WHERE [dbo].[SomeTable].[ID] = @ID0
update.Execute ()
tuttavia non riesce con:
{"Failed to convert parameter value from a String to a DateTime."}
at SubSonic.Update.Execute()
Esiste la possibilità di utilizzare le funzioni del server sql nelle espressioni?
Soluzione
Per l'esempio specifico che hai pubblicato, puoi semplicemente fare quanto segue:
SqlQuery update = new Update(SomeTable)
.SetExpression(SomeTable.SomeDateTimeColumn).IsEqualTo(DateTime.Now)
.Where(SomeTable.IdColumn).IsEqualTo(id);
Altri suggerimenti
Ok, ho trovato una soluzione alternativa: è possibile utilizzare le funzioni di SQL Server al di fuori di InlineQuery. Il trucco è che non devi usare " fortemente tipizzato " versione di SetExpression che utilizza il parametro TableColumn, ma passa le stringhe dei nomi di colonna, in questo modo:
SqlQuery update =
new Update(SomeTable)
.SetExpression(SomeTable.Columns.SomeDateTime).IsEqualTo("GETDATE()")
.Where(SomeTable.IdColumn).IsEqualTo(id);
La parte importante è: SomeTable.Columns.SomeDateTime
anziché SomeTable.SomeDateTimeColumn
.