【问题标题】:DataReader index outside bounds of ArrayDataReader 索引超出 Array 范围
【发布时间】:2015-03-07 13:17:57
【问题描述】:

我有以下方法从表中提取信息;

public Customer GetCustomerDetails(int customerID)
    {
        Customer currentCustomer = null;
        try
        {
            using (cxn = new SqlConnection(this.ConnectionString))
            {
                using (cmd = new SqlCommand("spGetCustomerInformation", cxn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@CustomerID", SqlDbType.Int).Value = customerID;
                    cxn.Open();
                    SqlDataReader dataReader = cmd.ExecuteReader();

                    currentCustomer = new Customer();
                    currentCustomer.CustomerID = customerID;

                    while (dataReader.Read())
                    {
                        currentCustomer.FirstName = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.firstName)).ToString();
                        currentCustomer.Surname = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.surname)).ToString();
                        currentCustomer.Email = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.email)).ToString();
                        currentCustomer.Phone = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.phone)).ToString();
                        currentCustomer.AddressLine1 = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.addressLine1)).ToString();
                        currentCustomer.AddressLine2 = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.addressLine2)).ToString();
                        currentCustomer.City = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.city)).ToString();
                        currentCustomer.County = dataReader.GetValue(Convert.ToInt32(CustomerTableColumns.county)).ToString();
                    }
                    dataReader.Close();
                    cxn.Close();
                }
            }
        }
        catch (SqlException)
        {
            throw;
        }

        return currentCustomer;
    }

但是我不断收到错误消息“System.Data.dll 中发生了 'System.IndexOutOfRangeException' 类型的未处理异常

附加信息:索引超出了数组的范围。”在 while 循环的最后一行。

我的 SQL 查询如下所示:

ALTER PROC [dbo].[spGetCustomerInformation]
@CustomerID INTEGER
AS 
BEGIN
SET NOCOUNT ON
SELECT
a.Firstname,
a.Surname,
a.Email,
a.Phone,
a.AddressLine1,
a.AddressLine2,
a.City,
County
FROM 
tblCustomers a
WHERE
a.CustomerID = @CustomerID
END

【问题讨论】:

  • INTEGER 替换为int i `procedure
  • 使用 dataReader["country"] 等代替你的枚举
  • No Joy,如果我改变 OUTPUT 我得到错误Msg 2715, Level 16, State 3, Procedure spGetCustomerInformation, Line 10 Column, parameter, or variable #1: Cannot find data type OUTPUT. Parameter or variable '@CustomerID' has an invalid data type.
  • 我会尝试不使用枚举
  • 与问题无关,但如果您要将数据读取器转换为对象列表,为什么不使用 sql 到 linq。看看这个stackoverflow.com/questions/1464883/…

标签: c# sql ado.net


【解决方案1】:

CustomerTableColumns 中有什么,您能给我们看看代码吗?

乍一看,我会说您的枚举 CustomerTableColumns 的第一个值是 1 到 8,而数据读取器预计是 0 到 7

【讨论】:

  • ` public enum CustomerTableColumns { customerID = 0, firstName, surname, email, phone, addressLine1, addressLine2, city, County }`
  • 正是问题所在。 firstName = 1 和 County =8,您的数据读取器将在索引 0 处具有 firstName。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多