循环数据集时获取错误

时间:2013-08-05 15:03:35

标签: c# sql dataset

我正在使用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)行发生错误;如果有人能向我解释这个问题,或者有任何帮助,那就太棒了。

3 个答案:

答案 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);
    }
}