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类型列的正确值。
不能在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();