如何将SELECT * FROM TABLE结果转换为c#中的多个变量

时间:2013-08-05 15:54:06

标签: c# sql sql-server select sqlcommand

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

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

此表格包含:gameID, Player1, Player2。 我的目的是将表中的玩家名称(Player1, Player2)变为C#中的2个变量,这样我就可以使用它们在表单中显示。 我尝试使用cmd.executeScalar(),但它只获得一个结果,而不是2。

我该怎么办呢?

5 个答案:

答案 0 :(得分:7)

首先,一些重要的建议:

  • 请勿使用SELECT *。您可能会得到与您的想法不同的东西(例如,如果在此期间数据库架构已更改)。而是明确指定您感兴趣的每一列。

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

所以你的代码变成了:

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

现在回答您的问题:如何接收每条记录的Player1Player2的值?这就是IDataReader进来的地方。数据读取器是结果表上的只向前游标,允许您访问每个返回记录的值:

// 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
    }        
}

答案 1 :(得分:1)

使用ExecuteReader();这里是example。另外,请查看我的question,了解如何阅读读者

答案 2 :(得分:1)

根据ExecuteScalar documentation

  

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

您必须使用ExecuteReader代替。此外,您的代码易受SQL注入攻击。

答案 3 :(得分: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. 连接数据库时正确处理非托管资源。

答案 4 :(得分:0)

使用cmd.ExecuteReader();代替executeScalar