【问题标题】:Out of range error on SqlDataReaderSqlDataReader 超出范围错误
【发布时间】:2013-02-21 15:03:20
【问题描述】:

我正在使用SqlDataReader 并在尝试读取列时收到此异常...

System.IndexOutOfRangeException: 记录

这里是代码...

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'是主键,intPART_NOvarchar(100)

问题是,我需要“记录”来识别记录以便稍后更新...

我真的不明白为什么它可以返回一个字段而不是另一个?

【问题讨论】:

  • Stuart 我建议您在使用AS 关键字时阅读SQL Aliasing,这是您需要在结果集中引用的字段,而不是数据库中的实际名称本身
  • 我知道 sql 别名...这是一个愚蠢的错误,我只是看不到。树林和树木等等!
  • 不是问题斯图尔特我想我可以看到..我只是提供一个意见没有伤害没有犯规

标签: c# asp.net sqldatareader


【解决方案1】:

那是因为您没有名为“record”的字段,您将其别名为“CUSTOMER_NO”,因此将代码更改为:

lblWebMasterMessage.Text += "record " + reader["CUSTOMER_NO"].ToString() + "<br />";

也就是说,您也可以使用索引而不是名称来读取第二列:

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

【讨论】:

  • 我会警告不要使用索引来引用列,因为如果您忘记更改索引,对 SQL 语句的更改可能会导致意外行为。
  • @Michael true 但另一方面,更改别名会导致我们的 OP 在使用名称引用列时遇到错误。
  • 啊……对不起!我没看到!!我为什么这样做?!我希望工作中的人不要管我,这样我就可以集中注意力,不再用我愚蠢的错误浪费人们的时间!!谢谢!! :)
  • Michael 你很接近,如果你要引用基于 reader[1].ToString() 的列,例如因为列长度可能会改变,但如果你是通过 Column Nae 来做的,你永远不会发现这是一个问题
【解决方案2】:

在我的例子中,这个错误是因为我不小心在我的命令文本中执行了两个 select 语句。我有两个单独的输出结果,第一个输出不包含我正在读取的列名,因此出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多