C# 如何在c中将SELECT*从表结果转换为多个变量

C# 如何在c中将SELECT*从表结果转换为多个变量,c#,sql,sql-server,select,sqlcommand,C#,Sql,Sql Server,Select,Sqlcommand,我在DB中有一个表,有3列,我有一个SELECT查询,如下所示: cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id); using (SqlConnection cnn = new SqlConnection(cnnString)) { cnn.Open(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM Game WHERE game

我在DB中有一个表,有3列,我有一个SELECT查询,如下所示:

cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id);
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);
        }
    }
}
此表有:gameID、Player1、Player2。 我的目的是将表中的Player1、Player2这两个球员的名字放入C语言中的两个变量中,这样我就可以用它们在表单中显示。 我尝试使用cmd.executeScalar,但它只得到一个结果,而不是2个

我怎样才能做到这一点呢?

使用cmd.ExecuteReader;使用ExecuteCalar代替ExecuteCalar

使用ExecuteReader;这是一个例子。此外,请查看我的主页,了解如何根据以下内容从阅读器中阅读:

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


你必须改用ExecuteReader。此外,您的代码容易受到SQL注入的攻击。

首先,有几个重要的建议:

不要使用SELECT*。您可能会得到与您所想不同的结果,例如,如果同时更改了数据库架构。相反,请明确指定您感兴趣的每一列

使用@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
    }        
}

考虑使用类似的方法:

cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id);
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);
        }
    }
}
通过使用这样的块,您可以得到三件事:

访问所需的字段。 防止SQL注入。 连接到数据库时正确处理非托管资源。
你用的是什么代码?您已经向我们显示了查询。伟大的这是一个开始。还有什么?您使用什么代码在数据库上实际执行此操作并读取其结果?单凭这一点是不够的,这是我的问题。我如何将结果读入两个变量。为什么它容易受到SQL注入的攻击?@shimritrevio:请访问维基百科