0

我在 DB 中有一个包含 3 列的表,并且我有一个这样的 SELECT 查询:

cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id);

这个表有:gameID, Player1, Player2。我的目的是将(Player1, Player2)表中的玩家姓名转换为 C# 中的 2 个变量,以便我可以使用它们在表单中显示。我尝试使用,cmd.executeScalar()但它只给我一个结果而不是 2。

请问我该怎么做?

4

5 回答 5

7

首先,一些重要的建议:

  • 不要使用SELECT *. 您可能会得到与您想象的不同的东西(例如,如果同时更改了数据库模式)。相反,明确指定您感兴趣的每一列。

  • 不要使用字符串连接将 SQL 查询粘合在一起,而是使用@parameterized查询。出于性能(查询缓存)和安全性(防止SQL 注入攻击)的原因,这是一个很好的原则。

所以你的代码变成:

cmd.CommandText = "SELECT Player1, Player2 FROM Game WHERE gameID = @gameId";
cmd.Parameters.AddWithValue("@gameId", game_id);

现在回答您的问题:如何接收每条记录的值Player1和值?Player2这就是IDataReaders 的用武之地。数据读取器是结果表上的只进游标,它允许您访问每个返回记录的值:

// SqlConnection connection = cmd.Connection;
connection.Open();
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
    int player1Index = reader.GetOrdinal("Player1");
    int player2Index = reader.GetOrdinal("Player2");
    while (reader.Read())  // one loop iteration per record returned from SELECT
    {
        string player1 = cmd.GetString(player1Index);
        string player2 = cmd.GetString(player2Index);
        … // do something with player1, and player2
    }        
}
于 2013-08-05T16:01:08.420 回答
1

使用ExecuteReader();这里的一个例子。另外,请在此处查看我的问题,了解如何从读者那里阅读

于 2013-08-05T16:00:16.480 回答
1

根据ExecuteScalar文档

执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

你必须ExecuteReader改用。您的代码也容易受到 SQL 注入的影响。

于 2013-08-05T16:00:23.817 回答
1

考虑使用这样的东西:

using (SqlConnection cnn = new SqlConnection(cnnString))
{
    cnn.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Game WHERE gameID = @gameID", cnn))
    {
        cmd.Parameters.AddWithValue("@gameID", game_id);
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            var player1 = rdr.GetString(1);
            var player2 = rdr.GetString(2);
        }
    }
}

通过使用这样的块,您可以获得三件事:

  1. 访问您想要的字段。
  2. 防止 SQL 注入。
  3. 连接到数据库时正确处理非托管资源。
于 2013-08-05T16:02:45.143 回答
0

使用cmd.ExecuteReader();代替 executeScalar

于 2013-08-05T15:59:07.570 回答