2017-07-29 80 views
-1

使用C#的一個n00b,已經使用vba一段時間並且正在逐步進行。在C#中使用SQL更新訪問數據庫 - 日期問題

我有這樣的代碼:

OleDbCommand sqlcom = new OleDbCommand("UPDATE tblpack SET packeduser = 1 AND packeddate ='" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + "' WHERE packid = " + packid, con); 

我知道它不是parametized,那將是我的下一個步驟,我真的只是學習基本知識現在。

我的問題是沒有日期部分,更新SQL工作正常。

與日期部分,沒有錯誤,但SQL不會最終發射。

我已經停止在執行非查詢和SQL看起來不錯... 我在Access中的日期字段設置爲空白,但我已經嘗試過「通用日期」,沒有運氣。

任何想法/

更新:!? 道歉你是100%正確的我不應該對安全甚至學習剋扣。 我改寫爲參數化,它正在工作。 我相信我的問題與AND,而不是在SQL(它是3am)。 Datetime.now實際上用於訪問,而不必轉換爲字符串。林不知道爲什麼這個工作..我已經讀了這麼多關於需要轉換!

OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString); 

         string strpacked = "UPDATE tblpack SET packeduser = 1, packeddate = ? WHERE packid = ?"; 

         OleDbDataAdapter dataadapter = new OleDbDataAdapter(); 

         OleDbCommand sqlcom = new OleDbCommand(strpacked, con); 

         sqlcom.Parameters.Add("?", OleDbType.Date, 5).Value = DateTime.Now; 
         sqlcom.Parameters.Add("?", OleDbType.Integer, 5).Value = packid; 

         dataadapter.SelectCommand = sqlcom; 

         con.Open(); 

         sqlcom.ExecuteNonQuery(); 
         row.Cells["clnpackeduser"].Value = "GA"; 
         con.Close(); 
+1

將值作爲參數傳遞,而不是使用字符串參數傳遞SQL字符串。 –

+1

使用參數應該是[第一步](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters-and-parameter-data-types)。 –

+1

*「我知道它不是參數化的......我現在真的只是學習基礎知識。」* - 使用參數化查詢*是基礎知識之一。爲什麼浪費時間與「做錯了」相關的問題爭吵,何時可以繼續並「做得對」? –

回答

0

MS Jet(MS Access數據庫引擎)日期格式爲:#MM/DD/YYYY hh:mm:ss#。 因此,你必須改變你的代碼是這樣的:

OleDbCommand sqlcom = new OleDbCommand("UPDATE tblpack SET packeduser = 1, packeddate =" + DateTime.Now.ToString("#MM/dd/yyyy HH:mm:ss#") + " WHERE packid = " + packid, con); 

要小心,我已刪除的例子'

在你的情況下,MS Jet無法解析日期字符串,並且離開日期爲空。

UPDATE:

您必須在SET子句中使用,代替AND

+0

請記住,**/**和**:**是日期和時間分隔符,不是斜線或冒號,小時數必須爲24,日期順序應爲ISO,因此:DateTime.Now .ToString(「#yyyy'/'MM'/'dd HH':​​'mm':'ss#」)'。 – Gustav