reader.Read() 只读一次,即使有多行要读

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

我有密码

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

在调试我的代码后,我看到它包含 4 个条目。然而,只有第一个结果是从 reader 中读取的。在第一次迭代以查找返回的结果是否为 null 之后,循环再次开始并立即结束,即使还有三行要读取。

任何关于为什么会发生这种情况的想法都将受到赞赏。

编辑 - 这是我使用的reader

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

不需要增量器。 reader.Read() 前进到下一条记录,如果没有更多行,returns false

查看 msdn

上的文档

DbDataReader的索引器(DataReader是别的东西)或者数据库特定的子类,returns指定的值(index or name)。

DbDataReader.Read() 移动到下一行。

如果您想对多列应用相同的逻辑,您需要遍历列、行:

while (db.Read()) {

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

}

您递增 "incrementer" 就好像那是行号一样,但是 DataReader 每次 Read() 只保存一行并且索引是针对字段号的。

使用这个:

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