在C#中执行SQL命令并将结果输出到DataGridView

时间:2013-07-17 18:17:57

标签: c# sql winforms ms-access

我正在尝试使用C#通过OleDbConnection在Access数据库上执行SQL命令,并使用该信息填充Windows窗体上的DataGridView。我打开了连接,声明了查询并执行了它,但我找不到如何将结果输出到Windows窗体上的DataGridView(名为dataOutput)。

    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。任何帮助将非常感激。谢谢!

5 个答案:

答案 0 :(得分:3)

替换为ExecuteDataSet method

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

我建议您在使用blok时设置密切连接,或者尝试使用最后的try catch

最佳实践

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

答案 1 :(得分:1)

一些评论:

  1. 您的查询受SQL注入。改为使用参数化查询。
  2. 您无需打开/关闭连接; DataAdapter将为您做到这一点。
  3. 您应该将OleDbConnectionOleDbCommand个对象包装在using块中,以确保清理其资源。
  4. 您无需在命令上调用ExecuteNonQuery或任何其他Execute...方法;
  5. 您需要将命令分配给SelectCommand的{​​{1}}属性,或将其传递给构造函数。
  6. 尝试这样的事情:

    OleDbDataAdapter

答案 2 :(得分:0)

我认为你也可以将数据加载到DataTable中并将DataGridView指向表:

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

答案 3 :(得分:0)

您不应该执行OleDbSearch.ExecuteNonQuery这仅用于修改数据的查询(INSERT / UPDATE)。而是将命令分配给dataadatper:

objDataAdapter.SelectCommand = OleDbSearch;

然后执行Fill和DataSource分配。

答案 4 :(得分:0)

使用OleDbDataAdapter检索DataSet的正确方法是将OleDbCommand与OleDbDataAdapter的SelectCommand属性相关联。您只需将OleDbCommand传递给OleDbDataAdapter的构造函数即可。

此外,您的代码应该对命令文本使用参数化查询,而不是字符串连接。使用参数化查询可以避免Sql注入,并且正确解析文本,日期,小数变量是由框架代码完成的。

   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是需要注意的另一点。这将确保在异常的情况下正确关闭和处理连接,命令和适配器。