2013-07-17 48 views
2

我想用C#在一個OleDbConnection上的Access數據庫執行SQL命令,並使用該信息來填充在Windows窗體上一個DataGridView。我打開了連接,說明了查詢並執行了它,但是我找不到如何將結果輸出到窗體上的DataGridView(名爲dataOutput)。執行SQL命令,並輸出結果的DataGridView在C#

private void Query() 
    { 
     string cmdText = "SELECT * FROM RetentionTable " + 
      "WHERE [DateTime] BETWEEN '" + getDateTimeFrom("") + "' AND '" + getDateTimeTo("") + "'"; 

     string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb"; 

     try 
     { 
      OleDbConnection cn = new OleDbConnection(ConnectionPath); 
      DataSet objDataSet = new DataSet(); 
      OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(); 

      if (cn.State.Equals(ConnectionState.Closed)) 
      { 
       cn.Open(); 
      } 

      OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn); 
      OleDbSearch.ExecuteNonQuery(); 

      objDataAdapter.Fill(objDataSet); 
      dataOutput.DataSource = objDataSet; 
      cn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
      MessageBox.Show(ex.StackTrace.ToString()); 
     } 

    } 

從我所看到的,是被正確執行查詢,但試圖使用objDataAdapter.Fill當問題來了。我想我不理解如何用查詢的輸出填充DataSet。任何幫助將非常感激。謝謝!

回答

1

幾點意見:

  1. 您所查詢的是受到SQL注入。改用參數化查詢。
  2. 您不需要打開/關閉連接; DataAdapter將爲您做到這一點。
  3. 你應該換一個usingOleDbConnectionOleDbCommand對象,以確保他們的資源將會被清理。
  4. 你並不需要調用ExecuteNonQuery,或者在命令任何其他Execute...方法;
  5. 您需要在命令分配給OleDbDataAdapterSelectCommand財產,或將其傳遞給構造函數。

嘗試是這樣的:

private void Query() 
{ 
    const string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb"; 

    try 
    { 
     using (var cn = new OleDbConnection(ConnectionPath)) 
     using (var cmd = new OleDbCommand("SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? And ?")) 
     { 
     // Parameter names don't matter; OleDb uses positional parameters. 
     cmd.Parameters.AddWithValue("@p0", getDateTimeFrom("")); 
     cmd.Parameters.AddWithValue("@p1", getDateTimeTo("")); 

     var objDataSet = new DataSet(); 
     var objDataAdapter = new OleDbDataAdapter(cmd); 
     objDataAdapter.Fill(objDataSet); 

     dataOutput.DataSource = objDataSet; 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message.ToString()); 
     MessageBox.Show(ex.StackTrace.ToString()); 
    } 
} 
+0

所以我做了這個,它似乎正在執行,但有沒有數據顯示在網格視圖中,它只顯示沒有條目,我有AutoGenerateColuns = true,但沒有數據。 – 1337Atreyu

3

ExecuteDataSet method

.. 
OleDbSearch.ExecuteDataSet(); 
objDataAdapter.Fill(objDataSet); 
dataOutput.DataSource = objDataSet; 
... 

更換,我建議您設置使用BLOK緊密連接或與最後的嘗試捕捉

最佳實踐

using(var cn = new OleDbConnection(ConnectionPath)) 
{ 
    ... 
} 
0

的我想你可以試試還將數據加載到DataTable中並將DataGridView指向該表格:

DataTable dt = new DataTable(); 
dt.Fill(OleDbSearch.ExecuteReader()); 
dataOutput.DataSource = dt; 
0

你不應該執行OleDbSearch.ExecuteNonQuery這僅用於修改數據(INSERT/UPDATE)查詢。相反,分配給你命令dataadatper:

objDataAdapter.SelectCommand = OleDbSearch; 

然後盡你Fill和DataSource分配。

0

檢索使用OleDbDataAdapter數據集的正確方法是將OleDbCommand關聯到OleDbDataAdapter的的SelectCommand財產。您只需將OleDbCommand傳遞給OleDbDataAdapter的構造函數即可。

而且你的代碼應該使用參數化查詢命令的文本,而不是一個字符串連接。使用參數化查詢可以避免Sql Injections,並且正確解析文本,日期,小數變量由框架代碼完成。

string cmdText = "SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? AND ?"; 
    string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb"; 
    try 
    { 
     using(OleDbConnection cn = new OleDbConnection(ConnectionPath)) 
     using(OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn)) 
     using(OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(OleDbSearch)) 
     { 
      OleDbSearch.Parameters.AddWithValue("@p1", getDateTimeFrom("")); 
      OleDbSearch.Parameters.AddWithValue("@p2", getDateTimeTo("")); 
      DataSet objDataSet = new DataSet(); 
      cn.Open(); 
      objDataAdapter.Fill(objDataSet); 
      dataOutput.DataSource = objDataSet; 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message.ToString()); 
     MessageBox.Show(ex.StackTrace.ToString()); 
    } 

using statement是另一點要注意。這將確保在出現異常情況時也能正確關閉和處理連接,命令和適配器。

+0

這則給我出「SelectCommand屬性還沒有被調用之前初始化‘錯誤填寫’ – 1337Atreyu

+0

這真是奇怪,因爲你可以從看到。 docs here http://msdn.microsoft.com/en-us/library/0wz82t73.aspx傳遞OleDbCommand給OleDbDataAdapter的構造函數分配SelectCommand屬性 – Steve