2016-04-07 10 views
0

ich den Code zum Lesenreader.Read() las nur einmal, auch wenn es mehrere Reihen

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

, die meinen Code nach dem Debuggen i 4 Einträge sehen enthält. Es wird jedoch nur das erste Ergebnis vom Leser gelesen. Nach der ersten Iteration, um festzustellen, ob das zurückgegebene Ergebnis Null ist oder nicht, beginnt die Schleife erneut und wird sofort beendet, obwohl drei weitere Zeilen zu lesen sind.

Irgendwelche Ideen, warum dies möglicherweise auftreten würde approved.

bearbeiten - das ist der Leser i verwendet

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

Was ist 'reader'? Ein StreamReader/DataReader oder etwas anderes? Wie sehen Ihre Daten aus? – Ian

+0

Do 'reader [incrementer]' oder 'reader.GetString (incrementer)' geht der Leser zufällig weiter? –

+0

Das ist, was ich denke, aber ich sehe es nicht anders. – JOsh

Antwort

0

Sie Inkrementieren „Inkrementierer“ als ob das die Zeilennummer war , aber ein DataReader enthält nur eine Zeile pro Read() und die Indexierung bezieht sich auf die Feldnummer.

verwenden:

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

Incrementer ist nicht erforderlich. reader.Read() rückt zum nächsten Datensatz vor und gibt false zurück, wenn keine weiteren Zeilen vorhanden sind.

prüfen Dokumentation auf msdn

+0

der Name Inkrementierer ist nur eine schlecht benannte Variable, es soll eigentlich sein, Daten aus jeder Spalte nicht in die nächste Zeile zu erhöhen. – JOsh

2

Der Indexer von DbDataReader (DataReader ist etwas anderes) oder eine Datenbank spezifische Unterklasse, gibt den Wert der angegebenen (von index or name).

Während DbDataReader.Read() in die nächste Zeile verschoben wird.

Wenn Sie die gleiche Logik auf mehrere Spalten, die Sie Schleife über die Spalten anwenden müssen, und die Zeilen:

while (db.Read()) { 

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

}