SqlDataReader出现超出范围错误

3

我正在使用SqlDataReader,在尝试读取列时出现以下异常:

System.IndexOutOfRangeException: record

这是代码:

SqlCommand select = new SqlCommand("SELECT RTRIM(LTRIM(PART_NO)) AS PART_NO, record AS CUSTOMER_NO FROM [RMAData].[dbo].[IMPORTING_ORDER_EDI] WHERE sessionID = '" + Session.SessionID + "'", connection);
SqlDataReader reader = select.ExecuteReader();

if (reader.HasRows)
{
   while (reader.Read())
   {
       lblWebMasterMessage.Text += "record " + reader["record"].ToString() + "<br />";
...

如果我将 lblWebMasterMessage.Text 更改为以下内容,则可以正常工作...
lblWebMasterMessage.Text += "record " + reader["PART_NO"].ToString() + "<br />";

SQL Server表中“record”和“PART_NO”的区别在于,“record”是主键和一个“int”,而“PART_NO”是一个“varchar(100)”。问题是,我需要使用“record”来标识记录以便稍后更新它...我真的看不出为什么它可以返回一个字段而不是另一个字段?

1
Stuart,我建议你在使用 AS 关键词时阅读有关 SQL 别名 的文档,因为你需要引用结果集中的字段而不是数据库本身中实际的名称。 - MethodMan
我知道关于SQL别名的事情...这是一个愚蠢的错误,我就是看不见森林反而迷失了树木!! - Stuart
没问题,斯图尔特。我能理解你的想法。我只是提供了一个意见,没有任何伤害。 - MethodMan
2个回答

10
那是因为您没有名为“record”的字段,而是将其别名设置为“CUSTOMER_NO”,因此请将代码更改为:
lblWebMasterMessage.Text += "record " + reader["CUSTOMER_NO"].ToString() + "<br />";

话虽如此,您也可以使用索引而非名称来读取第二列:

lblWebMasterMessage.Text += "record " + reader[1] + "<br />";

1
我建议不要使用索引来引用列,因为如果您忘记更改索引,对SQL语句进行更改可能会导致意外行为。 - Michael Minton
1
@Michael 确实,但另一方面,更改别名将导致我们的 OP 在使用名称引用列时遇到的错误。 - Shadow The Spring Wizard
2
啊...对不起!我没有看到那个!!我为什么会那样做?!我希望工作中的人们能够让我静静地集中精神,别再因为我愚蠢的错误浪费大家的时间了!!谢谢!:) - Stuart
Michael,你说得很接近了。如果你是根据reader[1].ToString()引用列的话,那么这只适用于特定情况。因为列长度可能会改变,但如果你是通过“列名”来引用的话,你就不会遇到这个问题。 - MethodMan

2

在我的情况下,这个错误是因为我在命令文本中意外地执行了两个select语句。我有两个单独的输出结果,而第一个输出不包含我正在读取的列名,因此出现了错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接