user2904607
user2904607

Reputation: 1

ODBCDataReader has rows but can not access data

So in C#, I have an ODBCDataReader that returns that it has rows, but when I try to access the data it returns an object not set to a reference of an object error. I tested the sql directly on the db and it does return a row without any nulls

OdbcDataReader results;
try
{
// Initialize & open odbc connection
using (OdbcConnection conn = new OdbcConnection(connectionString.ToString()))
{
    conn.Open();

    // Initialiaze odbc command object
    using (OdbcCommand comm = new OdbcCommand(query.ToString(), conn))
    {
        results = comm.ExecuteReader();

    } 
} 
} 
catch
{
//detailed error messaging here (which does not get hit)
}

temp = results;

if (temp.HasRows == false)
{
//error messaging here does not get hit.
}
while (temp.Read())
{
    try
    {
        //I attempted to access the data by creating an object array:
        object [] objarray = new object[temp.FieldCount)
        temp.GetValues(objarray); //this causes error
    }
    catch{ // error is caught here "object not set to a reference of an object" }

    for (i = 0; i < temp.FieldCount; i++)
 {
    try
    {
                    //I also attempted other ways to access the data including:
        temp[i].ToString(); // this causes error
        temp.GetInt32(i).ToString(); // this causes error
                    temp.GetName(i); //this causes error
    }
    catch
    {
        // error is caught here "object not set to a reference of an object"
    }
 }
}

Upvotes: 0

Views: 874

Answers (2)

Oliver Nicholls
Oliver Nicholls

Reputation: 1431

I ran into this same issue. The problem in my case was that I was not binding my parameters correctly. I was binding using @:

SELECT * FROM MyTable WHERE MyField = @MyField

For some reason, this is valid in MySQL and doesn't produce an error, but will not return data. The solution was to bind using ?:

SELECT * FROM MyTable WHERE MyField = ?

Then in C# bind the parameters:

cmd.Parameters.AddWithValue("@MyField", myFieldValue);

Old question, but it's the first result on Google and unanswered. Hope it's helpful.

Upvotes: 0

NYCdotNet
NYCdotNet

Reputation: 4647

You are using it outside the using blocks. Move the part where you use [results] inside the using blocks (immediately after the ExecuteReader() call) and you should be in a much better place.

Upvotes: 2

Related Questions