我为我的C#程序编写了一个SQL查询但是当我尝试运行查询时出现此错误
System.IndexOutOfRangeException:
我试图更改查询顺序以查看是否是唯一一个这样做的人,我注意到当我在while (DRorder.Read())
中尝试转换至少2个的代码时,它只给了我这个错误这三列(ADRES
,LEV
,TAAL
)。
// 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();
}
我不知道它为什么这样做,因为我的程序中的所有其他查询都工作,我甚至有查询整个表的查询,并且那些在{{1}中没有任何问题循环。
现在我的问题是,为什么其中一个代码块工作而另一个代码发生错误?也许如果一个人知道解决方案,我想听听它,因为我觉得把它全部放到一个查询中会更好。
我知道我忘了在这些代码块中放置while
个查询。
有关此问题的其他信息:当我运行单个查询代码时,提供错误的列为Dispose
但如果我更改列的顺序,则问题将由列出的第二列给出这3个(LEV
,ADRES
,LEV
)。
编辑:“新”代码(数据库有28列)
TAAL
答案 0 :(得分:1)
此查询
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();
答案 1 :(得分:1)
在选择查询中使用显式列名:
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,并且在调用此数据时没有其他操作正在操作数据。
您能否汇报上述代码输出的内容?
答案 2 :(得分:0)
似乎它没有作为1个查询工作的原因是我在查询期间填充了TextChange event
组合框,并且由于覆盖了阅读器。