2013-07-17 49 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