我正在使用VS 2012 C#。我试图遍历数据集以从Access数据库获取信息。我有一个组合框,当选择一个项目时,它应该打印出该给定方案的所有数据。对于某些组合框中的值我得到了错误,"在调用'填充'之前,尚未初始化SelectCommand属性。"但是对于其他一些价值观而言,我不会在没有问题的情况下检索信息。这是所有必要的代码,
con2.Open();
ad2 = new OleDbDataAdapter(query, con2);
ad2.Fill(ds2, "AC_SCENARIO");
con2.Close()
try
{
string end = "ENDDATE";
string start = "START";
foreach (DataRow drRow in ds2.Tables[0].Rows)
{
for (int i = 0; i <= ds2.Tables[0].Columns.Count; i++)
{
string qual0 = ds2.Tables["AC_SCENARIO"].Rows[i]["QUAL0"].ToString();
string qual1 = ds2.Tables["AC_SCENARIO"].Rows[i]["QUAL1"].ToString();
string qual2 = ds2.Tables["AC_SCENARIO"].Rows[i]["QUAL2"].ToString();
string qual3 = ds2.Tables["AC_SCENARIO"].Rows[i]["QUAL3"].ToString();
string qual4 = ds2.Tables["AC_SCENARIO"].Rows[i]["QUAL4"].ToString();
//HERE IS A SAMPLE QUERY
if (qual0 != null && (string)comboBox1.SelectedItem == qual0)
{
ad.SelectCommand = new OleDbCommand("SELECT b.RSV_CAT, b.SEQNUM, b.LEASE, b.WELL_ID, a.QUALIFIER, a.KEYWORD, a.EXPRESSION FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b on a.PROPNUM=b.PROPNUM WHERE a.KEYWORD = '"
+ end + "' AND (a.QUALIFIER = '" + qual0 + "' OR a.QUALIFIER IS NULL) AND NOT a.EXPRESSION Like '%[/@]%'", con);
}
ds.Clear();
ad.Fill(ds); //The SelectCommand property has not been initialized before calling 'Fill'.
//ERROR OCCURS HERE
con.Open();
ad.SelectCommand.ExecuteNonQuery();
con.Close();
编辑:这是骗局
String filePath = textBox1.Text;
con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath);
我有更多查询,例如为其他数据集列出的查询,然后我将两个数据集合并在一起并将它们输出到datagridview。 ad.Fill(ds)行发生错误;如果有人能向我解释这个问题,或者有任何帮助,那就太棒了。
答案 0 :(得分:1)
DataTable
的列集合零基于索引并且比Count
少一个,循环应该比第一列位于{{的列数少一列1}}索引和最后一列是列0
。您可以在循环条件中使用count-1
代替<
来从<=
迭代到zero
。
更改
Count-1
到的
for (int i = 0; i <= ds2.Tables[0].Columns.Count; i++)
在OP
中的代码中也不会出现con的创建答案 1 :(得分:1)
问题可能在这里
if (qual0 != null && (string)comboBox1.SelectedItem == qual0)
在某些情况下,if循环结果为true,ad.SelectCommand将初始化。
修改强>
您确定Select命令正在为qual0的每个值正确形成。
请在形成查询时尝试使用命名参数。 qual变量可能包含一些'
,阻止您的查询正确形成..
编辑
qual0.Replace("'","\"");
答案 2 :(得分:0)
如果qual0
为空,则您没有提供默认案例。
我将假设您多次执行此操作并且不仅仅是您检查并构建语句的qual
变量,如果是这种情况那么您可能最好重构这样的事情:
if (qual0 != null && (string)comboBox1.SelectedItem == qual0)
{
ad.SelectCommand = new OleDbCommand("SELECT b.RSV_CAT, b.SEQNUM, b.LEASE, b.WELL_ID, a.QUALIFIER, a.KEYWORD, a.EXPRESSION FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b on a.PROPNUM=b.PROPNUM WHERE a.KEYWORD = '"
+ end + "' AND (a.QUALIFIER = '" + qual0 + "' OR a.QUALIFIER IS NULL) AND NOT a.EXPRESSION Like '%[/@]%'", con);
}
if (ad.SelectCommand != null)
{
if (!String.IsNullOrEmpty(ad.SelectCommand.CommandText))
{
ds.Clear();
ad.Fill(ds);
}
}