IndexOutOfRange,除非我将查询拆分为多个查询



我已经为我的C#程序编写了一个SQL查询,但当我尝试运行该查询时,我得到了这个错误

System.IndexOutOfRangeException:

我试图改变查询顺序,看看这是否是唯一一个这样做的,我注意到只有当我在while (DRorder.Read())中有代码试图转换这3列中的至少2列(ADRESLEVTAAL)时,它才会给我这个错误。

// the code that gives the error    
SqlCommand getlist = new SqlCommand("select * from BESW where BEST = @best", Connectie.connMEVO);
getlist.Parameters.Add("@best", SqlDbType.VarChar).Value = data.corrigeerbestnr;
DRorder = getlist.ExecuteReader();
while (DRorder.Read())
{
    dateTimePicker1.Value = Convert.ToDateTime(DRorder["BESTEL"]);
    dateTimePicker2.Value = Convert.ToDateTime(DRorder["PLAN"]);
    comboBox2.Text = DRorder["ADRES"].ToString();
    comboBox1.Text = DRorder["LEV"].ToString();
    textBox8.Text = DRorder["TAAL"].ToString();
}

然而,当我将查询拆分为3个几乎相同的查询,其中3列中的每一列都可能出现错误时,它突然就可以正常工作了。

// this is the code that im currently using without error    
SqlCommand getlist = new SqlCommand("select BESTEL, [PLAN], ADRES from BESW where BEST = @best", Connectie.connMEVO);
getlist.Parameters.Add("@best", SqlDbType.VarChar).Value = data.corrigeerbestnr;
DRorder = getlist.ExecuteReader();
while (DRorder.Read())
{
    dateTimePicker1.Value = Convert.ToDateTime(DRorder["BESTEL"]);
    dateTimePicker2.Value = Convert.ToDateTime(DRorder["PLAN"]);
    comboBox2.Text = DRorder["ADRES"].ToString();
}
SqlCommand getlist2 = new SqlCommand("select LEV from BESW where BEST = @best", Connectie.connMEVO);
getlist2.Parameters.Add("@best", SqlDbType.VarChar).Value = data.corrigeerbestnr;
DRorder = getlist2.ExecuteReader();
while (DRorder.Read())
{
    comboBox1.Text = DRorder["LEV"].ToString();
}
SqlCommand getlist3 = new SqlCommand("select TAAL from BESW where BEST = @best", Connectie.connMEVO);
getlist3.Parameters.Add("@best", SqlDbType.VarChar).Value = data.corrigeerbestnr;
DRorder = getlist3.ExecuteReader();
while (DRorder.Read())
{
    textBox8.Text = DRorder["TAAL"].ToString();
}

我不知道它为什么这么做,因为我程序中的所有其他查询都可以工作,我甚至有一些查询可以读取整个表,而这些查询在while循环中使用这些字段不会带来任何问题。

现在我的问题是,为什么这些代码块中的一个可以工作,而另一个会出错?也许如果有人知道这个问题的解决方案,我很想听听,因为我觉得最好把它都放在一个查询中。

我知道我忘了把查询的Dispose放在这些代码块中。

关于该问题的其他信息:当我运行单个查询代码时,给出错误的列是LEV,但如果我更改列的顺序,则问题将由这3列中列出的第二列(ADRESLEVTAAL)给出。

编辑:"新"代码(DB有28列)

// the code that gives the error    
SqlCommand getlist = new SqlCommand("select * from BESW where BEST = @best", Connectie.connMEVO);
getlist.Parameters.Add("@best", SqlDbType.VarChar).Value = data.corrigeerbestnr;
DRorder = getlist.ExecuteReader();
while (DRorder.Read())
{
    if (!DRorder.IsDBNull(10)) { dateTimePicker1.Value = Convert.ToDateTime(DRorder[10]); }
    if (!DRorder.IsDBNull(11)) { dateTimePicker2.Value = Convert.ToDateTime(DRorder[11]); }
    if (!DRorder.IsDBNull(7)) { comboBox1.Text = DRorder[7].ToString(); }
    if (!DRorder.IsDBNull(8)) { comboBox2.Text = DRorder[8].ToString(); }
    if (!DRorder.IsDBNull(25)) { textBox8.Text = DRorder[25].ToString(); }
}

此查询

select BESTEL,[PLAN],ADRES from BESW where BEST=@best

只返回3列,不能使用DRorder["LEV"]DRorder["TAAL"]

在第一个SELECT 中包含TAAL和LEV

SqlCommand getlist = new SqlCommand("select BESTEL,[PLAN],ADRES, LEV, TAAL from BESW where BEST=@best", Connectie.connMEVO);

更新

IndexOutOfRangeException表示"未找到具有指定名称的列。"

尝试按索引取值

comboBox1.Text = DRorder[3].ToString();
textBox8.Text = DRorder[4].ToString();

在选择查询中使用显式列名:

select BESTEL, PLAN, ADRES, LEV, TAAL from ...

和/或,正如@Ash所指出的,使用索引检索列

comboBox1.Text = DRorder[3].ToString();

无关,但我也可以建议:

if (!DRorder.IsDBNull(3)) comboBox1.Text = DRorder[3].ToString();

编辑,远程调试:

try
{
    DRorder = getlist.ExecuteReader();
    while (DRorder.Read())
    {
        Console.WriteLine("BESTEL: " + DRorder.GetOrdinal("BESTEL").ToString());
        Console.WriteLine("PLAN: " + DRorder.GetOrdinal("PLAN").ToString());
        Console.WriteLine("ADRES: " + DRorder.GetOrdinal("ADRES").ToString());
        Console.WriteLine("LEV: " + DRorder.GetOrdinal("LEV").ToString());
        Console.WriteLine("TAAL: " + DRorder.GetOrdinal("TAAL").ToString());
        if (!DRorder.IsDBNull(10)) { dateTimePicker1.Value = Convert.ToDateTime(DRorder[10]); }
        if (!DRorder.IsDBNull(11)) { dateTimePicker2.Value = Convert.ToDateTime(DRorder[11]); }
        if (!DRorder.IsDBNull(7)) { comboBox1.Text = DRorder[7].ToString(); }
        if (!DRorder.IsDBNull(8)) { comboBox2.Text = DRorder[8].ToString(); }
        if (!DRorder.IsDBNull(25)) { textBox8.Text = DRorder[25].ToString(); }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

我假设您没有在.read()的范围之外访问DRorder,并且在调用该函数时没有其他操作在操作数据。

你能汇报一下上面代码的输出吗?

似乎它不能作为1查询工作的原因是我填充的组合框在查询过程中触发了TextChange event,因此覆盖了读取器。

相关内容

  • 没有找到相关文章

最新更新