2017-04-03 29 views
0

我正在使用MS Access數據庫。我想獲得兩個日期之間的第一個和最後一個記錄。在查詢表達式「Datum_k使用BETWEEN運算符的SQL查詢會導致「查詢表達式中的語法錯誤」

語法錯誤的數量之間2017年4月3日:可是我用BETWEEN操作時出現錯誤。和2012年3月4日。'。

我的代碼:

private void GetPrviZadnjiBrojRacuna() 
{ 
    OleDbCommand commandOD = new OleDbCommand("SELECT Dokument FROM DnevniPromet WHERE (Datum_k BETWEEN " + datumOd + " AND " + datumDo + ") ORDER BY [Datum_k] ASC", dataModel.CS); 
    OleDbCommand commandDO = new OleDbCommand("SELECT Dokument FROM DnevniPromet WHERE [Datum_k] >= " + datumOd + " AND [Datum_k] <= " + datumDo + " ORDER BY [Datum_k] DESC", dataModel.CS); 

    try 
    { 
     dataModel.DT.Clear(); 
     OleDbDataAdapter ODbDA = new OleDbDataAdapter(commandOD); 

     if (!dataModel.CS.State.Equals(ConnectionState.Open)) 
     { 
      dataModel.CS.Open(); 
     } 

     // GET OD 
     ODbDA.Fill(dataModel.DT); 
     odRacuna = dataModel.DT.Rows[0].ToString(); 

     // GET DO 
     ODbDA.SelectCommand = commandDO; 
     dataModel.DT.Clear(); 
     ODbDA.Fill(dataModel.DT); 

     doRacuna = dataModel.DT.Rows[0].ToString(); 

     dataModel.CS.Close(); 
     dataModel.DataLoaded = true; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+5

首先,你應該參數化查詢中,不要使用字符串插值。但是你錯過了日期變量值的'''單引號。 –

+6

nononononono!決不;決不;從不 - 不會將輸入連接到SQL。決不。但是:是的,這不是有效的SQL。我*會*說「需要引號」,但我有一個可怕的猜疑,你會添加它們;它*實際*需要的是:*參數*。除非你告訴我們提供者在這裏,我們不能告訴你需要的確切語法;因爲你似乎在使用OleDb,我們無法推斷任何東西。你能告訴我們實際的服務器在這裏嗎?它是SQL Server嗎?甲骨文? ... 要麼? –

+0

嗯不是OleDb的自我explanitory笑它實際上是Access數據庫 – ChenChi

回答

5

解決兩個問題與您的代碼片段:

  • 你不應該使用字符串插值生成一個查詢。這適用於SQL注入。圍繞這一點的許多主題。我建議你閱讀。
  • 您錯過了日期字符串周圍的單引號'

使用參數化查詢,可以一舉兩得:

OleDbCommand commandOD = new OleDbCommand(@" 
    SELECT Dokument 
    FROM DnevniPromet 
    WHERE (Datum_k BETWEEN @datumOd AND @datumDo) 
    ORDER BY [Datum_k] ASC", dataModel.CS); 

commandOD.Parameters.AddRange(new OleDbParameter[] 
{ 
    new OleDbParameter("@datumOd", datumOd), 
    new OleDbParameter("@datumDo", datumDo) 
}); 
+0

韋爾普上解決了我的問題甚至認爲我從未發現我的原始查詢中出現了什麼問題 - 是的,我很懶,但我想我需要開始編寫參數。 – ChenChi

+1

使用Access時,您應該使用#而不是'當您使用日期常量。 https://msdn.microsoft.com/en-us/library/bb221200(v=office.12).aspx當然,使用參數是最好的(唯一的權利?)的方式去! –

相關問題