C# 在数据集中循环时获取错误

C# 在数据集中循环时获取错误,c#,sql,dataset,C#,Sql,Dataset,我正在使用VS 2012 C。我正在尝试通过循环数据集从Access数据库获取信息。我有一个组合框,当选择一个项目时,它应该打印出给定场景的所有数据。对于组合框中的某些值,我得到了错误,SelectCommand属性在调用“Fill”之前尚未初始化。但对于其他一些值,我不知道,并且检索信息时没有任何问题。这是所有必要的代码 con2.Open(); ad2 = new OleDbDataAdapter(query, con2); ad2.Fill(ds2, "AC_SCENARIO"); con

我正在使用VS 2012 C。我正在尝试通过循环数据集从Access数据库获取信息。我有一个组合框,当选择一个项目时,它应该打印出给定场景的所有数据。对于组合框中的某些值,我得到了错误,SelectCommand属性在调用“Fill”之前尚未初始化。但对于其他一些值,我不知道,并且检索信息时没有任何问题。这是所有必要的代码

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();

我有更多的查询,比如为另一个数据集列出的查询,然后我将两个数据集合并在一起,并将它们输出到datagridview。错误发生在ad.Fillds行上;如果有人能向我解释这个问题,或者有任何帮助,那就太好了

DataTable的Columns集合是基于零的索引,并且比Count少一个,循环应该比列数少一个,因为第一列的索引为0,最后一列的索引为Columns Count-1。你可以使用问题可能就在这里

 if (qual0 != null && (string)comboBox1.SelectedItem == qual0)
在某些情况下,if循环结果为true,ad.SelectCommand将被初始化

编辑 您确定Select命令对于qual0的每个值都正确形成吗。 请在形成查询时尝试使用命名参数。qual变量中可能有一些“错误”,这会妨碍查询的正确格式

编辑


您尚未提供if qual0为null的默认情况

我将假设您多次这样做,并且它不仅仅是您检查并为其构建语句的一个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);
    }
}

你已经调试过了,对吗?您已经通过调试器验证了它正在输入if块。。。对吗?您是否验证了这一行ad.SelectCommand=new OleDbCommandSELECT b.RSV_CAT、b.SEQNUM、b.LEASE、b.WELL_ID、a.QUALIFIER、a.KEYWORD、a.EXPRESSION FROM[AC_ECONOMIC]a internal JOIN[AC_PROPERTY]b在a.PROPNUM=b.PROPNUM上,其中a.KEYWORD='+end+'和a.QUALIFIER='+qual0+'或a.QUALIFIER为NULL,而不是像“%[@]]”这样的.EXPRESSION,con@DJKRAZE很好,如果它对组合框中的某些选定值有效,则应进行验证。您建议我如何纠正它?您可以尝试将qual0.Replace',\作为if块中的第一条语句。请尝试if ad.SelectCommand!=null{if!String.IsNullOrEmptyad.SelectCommand.CommandText{//code here}}将更新答案。由于某些原因,我仍然会收到相同的错误,并且在我清除ds.Clear时;和ad.Fillds;在你的if语句之外,它给我的“object”没有设置为对象的实例,如果这个helpsOk很好,这是我的想法,除了逐行检查调试器中的代码以找出它为null的原因之外。在ExecuteNonQuery之后调用Fill方法,还检查查询是否得到记录。是的,我不确定这是否是因为一旦我将Fill方法放在ExecuteNonQuery之后,它就会给我错误的对象引用,而不是设置为对象的实例。
for (int i = 0; i < ds2.Tables[0].Columns.Count; i++)
 if (qual0 != null && (string)comboBox1.SelectedItem == qual0)
qual0.Replace("'","\"");
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);
    }
}