JOsh
JOsh

Reputation: 167

reader.Read() only read once even when there are multiple rows to read

I have the code

while (reader.Read())
{
    if (reader[incrementer]!=DBNull.Value){
        string playerToInform = reader.GetString(incrementer).ToString();
        string informClientMessage = "ULG=" + clientIP + ","; //User Left Game
        byte[] informClientsMessage = new byte[informClientMessage.Length];
        informClientsMessage = Encoding.ASCII.GetBytes(informClientMessage);
        playerEndPoint = new IPEndPoint(IPAddress.Parse(playerToInform), 8001);
        clientSocket.SendTo(informClientsMessage, playerEndPoint);
    }
    incrementer++;
}

which after debugging my code i see contains 4 entries. However only the first result is ever read from the reader. After the first iteration to find if the result returned is null or not the loop starts again and immediately finishes even though there are three more rows to read.

Any ideas as to why this may be occuring would be apprechiated.

edit - this is the reader i used

OleDbDataReader reader = dBConn.DataSelect("SELECT player1_IP, player2_IP, player3_IP, player4_IP FROM running_games WHERE game_name = '" + gameName + "'", updateGameList);

Upvotes: 0

Views: 730

Answers (3)

Gusman
Gusman

Reputation: 15151

You're incrementing "incrementer" as if that was the row number, but a DataReader holds only one row per Read() and the indexing is for the field number.

Use this:

while (reader.Read())
{
    for(int colNum = 0; colNum < 4; colNum++)
    {
        if (reader[colNum]!=DBNull.Value)
        {
            string playerToInform = reader.GetString(colNum).ToString();
            string informClientMessage = "ULG=" + clientIP + ","; //User Left Game
            byte[] informClientsMessage = new byte[informClientMessage.Length];
            informClientsMessage = Encoding.ASCII.GetBytes(informClientMessage);
            playerEndPoint = new IPEndPoint(IPAddress.Parse(playerToInform), 8001);
            clientSocket.SendTo(informClientsMessage, playerEndPoint);
        }
    }
}

Upvotes: 0

Richard
Richard

Reputation: 108975

The indexer of DbDataReader (DataReader is something else) or a database specific subclass, returns the value of the specified (by index or name).

While DbDataReader.Read() moves to the next row.

If you want to apply the same logic to multiple columns you need to loop over the columns, and the rows:

while (db.Read()) {

  for (var colIdx = 0; colIdx < columnCount. ++colIdx) {
    if (!db.IsDbNll(colIdx)) {
      string value = db.GetString(colIdx);
      // Process value
    }
  }

}

Upvotes: 2

Nino
Nino

Reputation: 7095

Incrementer is unnecessary. reader.Read() advances to next record and returns false if there are no more rows.

Check documentation on msdn

Upvotes: 0

Related Questions