IndexOutOfRange 除非我将查询拆分为多个查询
IndexOutOfRange unless I split the query into multiple queries
我已经为我的 C# 程序编写了一个 SQL 查询,但是当我尝试 运行 查询时,我得到了这个错误
System.IndexOutOfRangeException:
我试图改变查询顺序以查看是否只有它这样做,我注意到只有当我在 while (DRorder.Read())
中有代码试图转换至少这 3 列中的 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();
}
我不知道它为什么这样做,因为我程序中的所有其他查询都有效,我什至有读取整个 table 的查询,并且这些查询没有任何问题while
循环中的字段。
现在我的问题是,为什么这些代码块中的一个有效而另一个却出错?也许如果有人知道这个问题的解决方案,我想听听,因为我觉得最好将它全部放入 1 个查询中。
我知道我忘了将查询的 Dispose
放入这些代码块中。
有关该问题的其他信息:当我 运行 单个查询代码时,给出错误的列是 LEV
但如果我更改列的顺序,问题将由第二列列出了这 3 个(ADRES
、LEV
、TAAL
)。
编辑:"new" 代码(数据库有 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
returns只有3列,不能取DRorder["LEV"]
、DRorder["TAAL"]
在第一个中包含 TAAL 和 LEV SELECT
SqlCommand getlist = new SqlCommand("select BESTEL,[PLAN],ADRES, LEV, TAAL from BESW where BEST=@best", Connectie.connMEVO);
更新
IndexOutOfRangeException 意味着 "No column with the specified name was found."
尝试按索引取值
comboBox1.Text = DRorder[3].ToString();
textBox8.Text = DRorder[4].ToString();
在 select 查询中使用明确的列名:
select BESTEL, PLAN, ADRES, LEV, TAAL from ...
and/or,正如@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
并且由于覆盖了 reader.
我已经为我的 C# 程序编写了一个 SQL 查询,但是当我尝试 运行 查询时,我得到了这个错误
System.IndexOutOfRangeException:
我试图改变查询顺序以查看是否只有它这样做,我注意到只有当我在 while (DRorder.Read())
中有代码试图转换至少这 3 列中的 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();
}
我不知道它为什么这样做,因为我程序中的所有其他查询都有效,我什至有读取整个 table 的查询,并且这些查询没有任何问题while
循环中的字段。
现在我的问题是,为什么这些代码块中的一个有效而另一个却出错?也许如果有人知道这个问题的解决方案,我想听听,因为我觉得最好将它全部放入 1 个查询中。
我知道我忘了将查询的 Dispose
放入这些代码块中。
有关该问题的其他信息:当我 运行 单个查询代码时,给出错误的列是 LEV
但如果我更改列的顺序,问题将由第二列列出了这 3 个(ADRES
、LEV
、TAAL
)。
编辑:"new" 代码(数据库有 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
returns只有3列,不能取DRorder["LEV"]
、DRorder["TAAL"]
在第一个中包含 TAAL 和 LEV SELECT
SqlCommand getlist = new SqlCommand("select BESTEL,[PLAN],ADRES, LEV, TAAL from BESW where BEST=@best", Connectie.connMEVO);
更新
IndexOutOfRangeException 意味着 "No column with the specified name was found."
尝试按索引取值
comboBox1.Text = DRorder[3].ToString();
textBox8.Text = DRorder[4].ToString();
在 select 查询中使用明确的列名:
select BESTEL, PLAN, ADRES, LEV, TAAL from ...
and/or,正如@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
并且由于覆盖了 reader.