我正在尝试使用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。任何帮助将非常感激。谢谢!
答案 0 :(得分:3)
替换为ExecuteDataSet method
..
OleDbSearch.ExecuteDataSet();
objDataAdapter.Fill(objDataSet);
dataOutput.DataSource = objDataSet;
...
我建议您在使用blok时设置密切连接,或者尝试使用最后的try catch
最佳实践
using( var cn = new OleDbConnection(ConnectionPath))
{
...
}
答案 1 :(得分:1)
一些评论:
DataAdapter
将为您做到这一点。OleDbConnection
和OleDbCommand
个对象包装在using
块中,以确保清理其资源。ExecuteNonQuery
或任何其他Execute...
方法; SelectCommand
的{{1}}属性,或将其传递给构造函数。尝试这样的事情:
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是需要注意的另一点。这将确保在异常的情况下正确关闭和处理连接,命令和适配器。