System.IndexOutOfRangeException для значения SQLDataReader с использованием C # - PullRequest
3 голосов
/ 10 октября 2011

У меня есть SQLDataReader, который возвращает три целых числа.Однако бывают случаи, когда два целых числа возвращают нулевые значения.

Чтобы обойти это, я написал следующее:

int shoppingCartHeadID = 0;
int billID = 0;
int delID = 0;

conn.Open();
reader = comm.ExecuteReader();
if (reader.Read())
{
       shoppingCartHeadID = Convert.ToInt32(reader["shoppingCartHeadID"]);

       if (!reader.IsDBNull(billID))
       {
            billID = Convert.ToInt32(reader["billID"]);
       }

       if (!reader.IsDBNull(delID))
       {
            delID = Convert.ToInt32(reader["delID"]);
       }                
}
reader.Close();

К сожалению, я все еще получаю сообщение об ошибке.Любые предложения?

PS Я тоже попробовал это без удачи

if (reader ["billID"] = null)

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

Я бы попытался получить доступ по индексу вместо имени столбца, на тот случай, если вы передаете несуществующее имя столбца.

Кроме того, убедитесь, что вы обернули свое устройство чтения блоком использования, так что в любом случае, даже если есть исключение, ваше устройство чтения будет правильно закрыто и расположено, например, таким образом:

...
using(var reader = comm.ExecuteReader())
{
    if (reader.Read())
    {
           shoppingCartHeadID = Convert.ToInt32(reader[0]);

           if (!reader.IsDBNull(1))
           {
                billID = Convert.ToInt32(reader[1]);
           }

           if (!reader.IsDBNull(2))
           {
                delID = Convert.ToInt32(reader[2]);
           }
    }
}
0 голосов
/ 10 октября 2011

Использовать GetXXXX(colIndex) метод.

if (!reader.IsDBNull(0)) // I presume that billid at 0 ordinal  
 {
    billID = reader.GetInt32(0);
 }
if (!reader.IsDBNull(1)) // I presume that delId at 1 ordinal
 {
    delID = reader.GetInt32(1);
 }  
...