while leer hasrows dbdatareader datos data c# while-loop ado.net

c# - hasrows - reader.Read() solo lee una vez, incluso cuando hay varias filas para leer



sql data reader vb (3)

El indexador de DbDataReader ( DataReader es otra cosa) o una subclase específica de la base de datos, devuelve el valor especificado (por índice o nombre ).

Mientras DbDataReader.Read() mueve a la siguiente fila.

Si desea aplicar la misma lógica a varias columnas, debe recorrer las columnas y las filas:

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

Tengo el código

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++; }

que después de depurar mi código que veo contiene 4 entradas. Sin embargo, solo el primer resultado es leído por el lector. Después de la primera iteración para encontrar si el resultado devuelto es nulo o no, el ciclo comienza de nuevo e inmediatamente termina a pesar de que hay tres filas más para leer.

Cualquier idea sobre por qué esto puede estar ocurriendo sería aprehendida.

editar - este es el lector que utilicé

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


Está incrementando el "incremento" como si ese fuera el número de fila, pero un DataReader solo tiene una fila por Lectura () y la indexación es para el número del campo.

Utilizar esta:

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


Incrementer es innecesario. reader.Read() avanza al siguiente registro y devuelve false si no hay más filas.

Consulte la documentación en msdn