MySQL查询返回参数列名

本文关键字:数列 参数 返回 查询 MySQL | 更新日期: 2023-09-27 18:13:01

我正在VS2015中使用c#和MySQl查询我的数据库并返回标题为"方法"的VARCHAR类型列中的信息。但是,查询返回字符串"method",而不是method列的值。

下面是代码:

       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类型列的正确值。

MySQL查询返回参数列名

不能在select语句中参数化列名。你所做的就像说select 'foo' from log.transactions一样。它为每一行选择字符串'foo'一次。你只是在这里插入一个字符串值;它不会将字符串值解析为SQL。

你能做的(如果你能负担得起的话)是select * from log.transactions,然后你的c#代码可以在调用者传递给你名字的任何列中抓取数据。有了很多行,你可以从数据库中拖回很多无用的垃圾。

你想要在你所展示的代码中,只是这样:

string queryOne = "SELECT method FROM log.transactions";

如果你真的想参数化"方法",那是粗略的,因为SQL注入漏洞。

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

这看起来很好,直到一些喜剧演员使用您的应用程序在文本框中给您一个值"0; drop table 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();