2012-04-27 27 views
1

我得到一個「語法錯誤在INSERT INTO語句,但我想不出爲什麼。語法錯誤INSERT INTO語句中同時使用日期時間

我比較了聲明,別人我做的工作找,能找到沒有結構上的區別,唯一的區別是,在這一個,我試圖在我的MS Access數據庫中保存DateTime

我有我的數據庫字段設置爲日期/時間的一般格式, MM/DD/YY HH:MM:SS AM(或PM)。我的日期時間格式設置相同。

當我設置一箇中斷點並按照它,可以看到正在傳遞的DateTime格式是正確的並且與MS Access中的一般格式相匹配。

我確定這個問題對我來說是正確的,但如果我能看到它,我將會感到厭煩。這裏是我的代碼:

//method to save user input to database 
public static void SaveData(ProgramLoginBOL busObject) 
{ 
    try 
    { 
     String sSQLCommand = "INSERT INTO ProgramLogin (" + 
      "UserName, DateTime) VALUES ('" + busObject.UserName + 
      "','" + busObject.DtDate + "')"; 

     if (aConnection.State == ConnectionState.Closed) 
     { 
      aConnection.Open(); 
     } 

     OleDbCommand cmd = aConnection.CreateCommand(); 
     cmd.CommandText = sSQLCommand; 
     // Execute the SQL command 
     cmd.ExecuteNonQuery(); 
     aConnection.Close(); 

     MessageBox.Show("Data Saved");     
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     MessageBox.Show("Error! Data was not saved."); 
    } 
} 

正如我所說,調試表明busObject.DtDate匹配的MS訪問日期/時間格式來解決問題

+2

您有一個SQL注入漏洞。你需要使用參數。 – SLaks 2012-04-27 15:36:26

+0

謝謝你的幫助。 – 2012-04-27 15:45:41

回答

4

一種方法是使用參數化查詢來代替。這樣做會讓提供者擔心類型,而且您不必擔心用單引號(有助於像O'Donnel這樣的名稱)來分隔字符串值,或者使用#來爲日期值。作爲獎勵,它可以避免任何SQL注入攻擊。

要做到這一點用?對於參數

string sSQLCommand = "INSERT INTO ProgramLogin (" + 
      "UserName, DateTime) VALUES (?,?)" 

佔位符,然後再添加參數

cmd.Parameters.AddWithValue("?", busObject.UserName); 
    cmd.Parameters.AddWithValue("?", busObject.DtDate); 
+0

雖然這不是一項家庭作業,但我正在使用我的學校教科書作爲創建我的程序的指導方針,並沒有顯示出這樣的內容。爲了保護海報所謂的「SQL注入漏洞」,所有數據庫插入是如何進行的? – 2012-04-27 15:43:42

+1

@ProgrammingNewbie。使用參數化查詢是防止SQL注入的一種方法。使用Access,您可以使用具有參數的查詢定義進行此操作。使用其他數據庫,您可以改爲使用存儲過程。當然,如果您完全信任這些值,那麼它的問題就更少了 – 2012-04-27 15:47:23

+0

感謝您的幫助和信息。 – 2012-04-27 15:49:35

1

使用Access,則必須用#字符的日期。

所以,你的命令更改爲:

String sSQLCommand = "INSERT INTO ProgramLogin (UserName, DateTime) VALUES ('" + busObject.UserName + "',#" + busObject.DtDate + "#)"; 

格式的日期字符串喜歡本作的最好的結果:

#2012-04-21 13:21:25# 
+0

謝謝你的幫助 – 2012-04-27 15:46:13

1

您分配給訪問日期/時間列的顯示格式對查詢中日期/時間值的正確字符串格式沒有影響。

您可以在DateTime值上調用ToString的適當重載,將其格式化爲Access所需的格式,或者,如SLaks所述,您可以使用參數。使用參數更安全,這也意味着您不必擔心值的格式。 OleDb提供商將爲您提供幫助。

+0

非常感謝您的幫助。我認爲格式必須匹配。由於使用參數更安全,我會使用它。 – 2012-04-27 15:48:09

相關問題