C# MySQL查询返回参数列名

C# MySQL查询返回参数列名,c#,mysql,C#,Mysql,我在VS2015中使用C和MySQl查询我的数据库,并返回一个名为method的VARCHAR类型列中的信息。但是,查询返回字符串方法,而不是方法列的值 代码如下: string queryOne = "SELECT " + "@columnName" + " FROM log.transactions"; MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString); cm

我在VS2015中使用C和MySQl查询我的数据库,并返回一个名为method的VARCHAR类型列中的信息。但是,查询返回字符串方法,而不是方法列的值

代码如下:

       string queryOne = "SELECT " + "@columnName" + " FROM log.transactions";

        MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString);

        cmdOne.Parameters.AddWithValue("@columnName", "method");

        MySqlDataReader dataReaderOne = cmdOne.ExecuteReader();
        while (dataReaderOne.Read())
        {
            Console.WriteLine(dataReaderOne.GetString(0));
        }
        dataReaderOne.Close();
这是输出:

        method
        method
        method
          .
          .
          .

。。方法列中的行数。这是格式问题吗?我的数据库配置是否可能阻止VarChar正确返回?当我将查询更改为查询INT类型的列时,它将返回INT类型列的正确值。

您不能在select语句中参数化列名。你所做的很简单,比如说从log.transactions中选择'foo'。它为每行选择一次字符串“foo”。您只需在其中插入一个字符串值;它没有将字符串值解析为SQL

如果您负担得起,您可以做的是从log.transactions中选择*,然后您的C代码可以获取调用者传递给您的任何列中的数据。但是,如果有很多行,您可能会从数据库中拖回很多无用的垃圾

不过,您希望在显示的代码中包含以下内容:

string queryOne = "SELECT method FROM log.transactions";
若你们真的想参数化这个方法,那个就太粗略了,因为SQL注入漏洞

string queryOne = "SELECT " + fieldname + " FROM log.transactions";

这看起来不错,直到某个喜剧演员使用你的应用程序给你一个值0;删除表log.transactions;-在文本框中。那你就有麻烦了。如果您将字符串变量连接到要执行的SQL字符串中,您必须狂热地对其进行清理,即使这样,您也希望以任何方式避免它。这是俄罗斯轮盘赌

如果要保持列的动态性,查询的形式必须类似。现在相应地传递列名

string queryOne = "SELECT " + column_name + " FROM log.transactions";

MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString);        
MySqlDataReader dataReaderOne = cmdOne.ExecuteReader();
while (dataReaderOne.Read())
    {
        Console.WriteLine(dataReaderOne[column_name]);
    }
dataReaderOne.Close();

太棒了,谢谢你让我知道!