2015-03-07 3 views
0

У меня есть следующий метод, извлекающий информацию из таблицы;Индекс DataReader внешних границ массива

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.IndexOutOfRangeException“произошло в System.Data.dll

Дополнительная информация: Индекс находился вне границ массива.» на последней строке в цикле 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 
+0

Заменить 'INTEGER' с' 'int' я процедура – BNN

+0

использования DataReader ["country"] и т. д. вместо вашего перечисления – Ewan

+0

No Joy, если я меняю OUTPUT, я получаю ошибку 'Msg 2715, Level 16, State 3, Procedure spGetCustomerInformation, Line 10 Столбец, параметр или переменная # 1: Не удается найти тип данных ВЫВОД. Параметр или переменная '@CustomerID' имеет недопустимый тип данных. ' –

ответ

2

Что в CustomerTableColumns, могли бы вы показать нам код?

На первое предположение, я бы сказал, что первое значение ваших перечислений CustomerTableColumns составляет от 1 до 8 и DataReader бы ожидать, чтобы быть от 0 до 7

+0

'общественных перечисления CustomerTableColumns { CUSTOMERID = 0, ПгвЬЫат, фамилия, электронной почты, телефона, addressLine1, addressLine2, город, района }' –

+0

именно проблема. firstName = 1 и county = 8, ваш datareader будет иметь индекс 0 firstName. –

+0

Спасибо миллион –

Смежные вопросы