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);
}
}
}
我有密码
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);
}
}
}