CireS
CireS

Reputation: 19

OdbcDataReader Overwriting

I seem to be having problems with my method that will return an Integer. I am attempting to modify the rows of a particular column with this returning Integer. The database will update the pre-existing column values with this new returned value. However, it appears that every row is being modified to the LAST row's value, regardless of what the specific row held previously. I am sure my code is just overwriting the variable, but I am wondering where. Here is my method; would appreciate feedback.

private int extractValue()
{
  if (connection.State != ConnectionState.Open)
   { 
     this.connection.Open();
   }
   ParsingHelper helper = null // different class - no issues with this.
   String query = "SELECT device FROM dLogger";
   OdbcCommand command = new OdbcCommand(query, this.connection);
   List<Int32> list = new List<Int32>();
   OdbcDataReader reader = null;
   reader = command.ExecuteReader();
   while (reader.Read())
   {
     list.Add(reader.GetInt32(0));
     for (int i = 0; i < reader.FieldCount; i++)
      {
        helper = new ParsingHelper();
        helper.assemble(list[i]);
      }
     }
    return helper.getFirst();
   }

No problem with the ParsingHelper here, it does the correct work. My problem is the overwriting. I thought a List would alleviate this issue but I am missing something, evidently.

EDIT: Would this approach work better?

while(reader.Read())
{
  for (int i = 0; i < reader.FieldCount; i++)
   {
     list.Add(reader.GetInt32(i));
     //....
    }

If my table originally looked like this:

   ColA
    1
    2
    3
    4

And my function, for example, multiplied each number by 2. The new column would look like

 ColA
  8 // rather than 2
  8 // rather than 4
  8 // rather than 6
  8 // 8 is the last value - therefore, correct.

So you see, I am running into some overwriting issues here. It appears the reader will read effectively and to the last row but it is not modifying values correctly, it is only assigning each value to the last value.

EDIT: Here is where I am updating my database:

private void update() 
{
 String query = "UPDATE dLogger SET device = ?";
 OdbcCommand command = new OdbcCommand(query, this.connection);
 if (this.connection.State != ConnectionState.Open)
   {
     this.connection.Open();
    }
   command.Parameters.AddWithValue("?", extractValue());
  }

Also, here is my simple Parsing Helper Class assemble()

  private void assemble(int value)
  {
   setFirst(value);
  }

  private void setFirst(int value)
  {
    value = value * 2;
  }

Upvotes: -1

Views: 142

Answers (1)

Jonny
Jonny

Reputation: 1161

Just change your

String query = "SELECT device FROM dLogger";

to

String query = "UPDATE dLogger SET device=device*2";

thus:

private void extractValue()
{
  if (connection.State != ConnectionState.Open)
   { 
     this.connection.Open();
   }
   String query = "UPDATE dLogger SET device=device*2";
   OdbcCommand command = new OdbcCommand(query, this.connection);
   command.Execute();
}

Upvotes: 0

Related Questions