Utilizzo della funzione SQL Server in SqlExpression nella query di aggiornamento

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

  •  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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top