C# 索引自动失效,除非我将查询拆分为多个查询
我已经为我的C#程序编写了一个SQL查询,但是当我尝试运行该查询时,我得到了这个错误 System.IndexOutOfRangeException: 我试图改变查询顺序,看看这是否是唯一一个这样做的,我注意到只有当我在C# 索引自动失效,除非我将查询拆分为多个查询,c#,sql,sql-server,indexoutofrangeexception,C#,Sql,Sql Server,Indexoutofrangeexception,我已经为我的C#程序编写了一个SQL查询,但是当我尝试运行该查询时,我得到了这个错误 System.IndexOutOfRangeException: 我试图改变查询顺序,看看这是否是唯一一个这样做的,我注意到只有当我在while(DRorder.Read())中有代码试图转换这3列中的至少2列(ADRES,LEV,TAAL)时,它才会给我这个错误 但是,当我将查询拆分为3个几乎相同的查询,其中每一列都可能出现错误时,它突然可以正常工作 // this is the code that im c
while(DRorder.Read())
中有代码试图转换这3列中的至少2列(ADRES
,LEV
,TAAL
)时,它才会给我这个错误
但是,当我将查询拆分为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个列中列出的第二列给出(ADRES
,LEV
,TAAL
)
编辑:“新”代码(DB有28列)
这个问题
select BESTEL,[PLAN],ADRES from BESW where BEST=@best
仅返回3列,并且不能使用DRorder[“LEV”]
,DRorder[“TAAL”]
在第一个选择中包括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,并且在调用该函数时没有其他操作正在处理数据
你能报告一下上面的代码输出吗?似乎它不能作为一个查询工作的原因是我填充的组合框在查询过程中触发了
TextChange事件
,并因此覆盖了读卡器。很抱歉,这是我的一个错误,仅存在于本文中,我不得不从3个较小的查询中重新生成一个查询,但忘记了更改列。在代码中,它确实尝试获取每一列,但仍然存在相同的问题。不幸的是,这似乎不是那么简单,因为当在各自的查询中调用每一列时,这些列确实存在,只有在同一查询中调用这3个特定列中的2个或更多列时才会出现错误请参见此处的共识“不,他们不应该"!这不是SQL Server错误,您使用了错误的索引号或键,即使是这种情况,我不明白的是为什么它可以在3个单独的查询中工作,但如果我将它们放入一个查询中,它就不能工作。为什么您要在3个相同的查询中断开查询?你什么也得不到,但最终还是做了三轮Trips这就是为什么我很好奇为什么我分3步做,但在第1步或第2步做的时候它就坏了。我尝试过使用显式列名,但即使这样也没有改变什么,尝试使用列号检索它们会给我相同的错误,对于if
语句,我猜是为了防止空单元格/行?我怀疑它会改变什么,因为这些字段不能为空。(我试试看)@maam27在你的错误信息中还有其他信息吗。听起来可能是错误的sql列引用,也可能是类似c#数组的错误。但这两种方法都不能解释如果将查询分开,它为什么会工作。我有它,所以它会尝试按列号读取,现在它说:在没有数据时尝试读取无效
。我确实为每一列添加了if语句,并且我确定该列已填充,对于我必须填充的查询,它不会允许其中任何一列为空,就像使用越界索引一样。你能用“新”代码更新你的问题吗?我试过上面的代码,它在打印行上没有出现错误,但在文本框上仍然给出了错误。它在控制台中显示的值是:bestel:9
,plan:10
,adres:7
,lev:6
,taal:24
。还有,也许聊天更好?因为已经有相当多的评论了
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);
}