System.IndexOutOfRangeException on SQLDataReader Value Using C#

ComfortablyNumb picture ComfortablyNumb · Oct 10, 2011 · Viewed 10.2k times · Source

I have a SQLDataReader that returns three integers. However, there are occasions when two of the integers will return null values.

To get round this I wrote the following:

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();

Unfortunately I'm still getting the error message. Any suggestions?

PS I also tried this with no luck

if (reader["billID"] != null)

Answer

Davide Piras picture Davide Piras · Oct 10, 2011

I would try to access by index instead of column name, just in case you are passing a not existing column name.

Also, make sure you wrap your reader with a using block so in any case even if there is an exception your reader will be properly closed and disposed, for example in this way:

...
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]);
           }
    }
}