2013-09-28 61 views
2

我有一個應用程序將值存儲在Jet Blue數據庫中。我構建和問題,查詢什麼是「現在」的ADO.net參數化?

INSERT INTO Hisotry (DeathDate, Frob, Grobber) 
VALUES (Now(), "Unilatteral phase detractor's", "Sinusoidal depleneration") 

現在我遷移到不同的數據庫,我想這可能是時間使用 疼痛的屁股 看中參數:

void Trunnions(DbConnection connection, String frob, String grobber) 
{ 
    String sql = 
     "INSERT INTO Hisotry (DeathDate, Frob, Grobber)" + "\r\n"+ 
     "VALUES (@deathDate, @frob, @grobber)"; 

    using (DbCommand cmd = connection.CreateCommand()) 
    { 
     cmd.CommandText = sql; 
     DbParameter param; 

     param = cmd.CreateParameter(); 
     param.Name = "@deathDate"; 
     param.DbType = DbType.DateTime; 
     param.Value = "Now()"; 
     cmd.Parameters.Add(param); 

     param = cmd.CreateParameter(); 
     param.Name = "@frob"; 
     param.DbType = DbType.StringFixedLength; 
     param.Value = frob; 
     cmd.Parameters.Add(param); 

     param = cmd.CreateParameter(); 
     param.Name = "@grobber"; 
     param.DbType = DbType.String; 
     param.Value = grobber; 
     cmd.Parameters.Add(param); 

     cmd.ExecuteNonQuery(); 
    } 
} 

當然,試圖使用Now()作爲DbType.DateTime參數的值是無效的。

我可以用:

param = cmd.CreateParameter(); 
param.Name = "@deathDate"; 
param.DbType = DbType.DateTime; 
param.Value = DateTime.Now; 
cmd.Parameters.Add(param); 

除了這不是正確的 - 它使用本地計算機的時鐘,而不是服務器的。

我問的唯一原因是因爲我不知道Now()的新數據庫引擎的語法是什麼。我知道有一些可以使用:

  • getdate()
  • getutcdate()
  • SYSDATETIME()
  • SYSUTCDATETIME()
  • SYSDATETIMEOFFSET()
  • CURRENT_TIMESTAMP()
  • NOW()
  • LOCALTIMESTAMP()

我記得我花了小時在2008年要弄清楚使用什麼藍色噴氣機。我寧願有ADO.net解決方案。

+2

你有控制權架構?如果是,那麼只需使用默認值Now()(或其在數據庫引擎中的相當值)創建列,並且不要插入它。 – ChrisWue

+0

@ChrisWue我不知道。此外,我試圖找出如何參數化當前手工製作的查詢 –

回答

1

假設你正在使用SQL Server:

  1. 更改"Now()"DateTime.Now()不帶引號
  2. 更改插入語句爲:

    String sql = 
        "INSERT INTO Hisotry (DeathDate, Frob, Grobber)" + "\r\n"+ 
        "VALUES (GetDate(), @frob, @grobber)"; 
    
+0

這看起來像是唯一的解決方案,而且是合理的解決方案。參數'DeathDate'不是真的*參數;這是一個常數。 –