使用参数 SQLcommand 传递列名

passing columnname with a parameter SQLcommand

我一直在谷歌搜索一些我真的不明白的东西。 简而言之,我的问题是这样的;

使用这个时;

String sYear2 = "2020";
string query = @"Select decJan from Stats where intRecnum = (select intRecnum from Stats where intAr = @year)";
var cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@year", sYear2);

结果返回“111”(这是 2020 年 decJan 列的正确值。

但是在尝试这个的时候;

String sYear2 = "2020";
String sColumn2 = "decJan";
string query = @"Select " + @column + @" from tbFuGraddagar where intRecnum = (select intRecnum from tbfuGraddagar where intAr = @year)";
var cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@year", sYear2);
cmd.Parameters.AddWithValue("@column", sColumn2);

我收到 "decJan" 作为结果。

在谷歌搜索时,我发现没有动态 SQL 是不可能的,或者那是糟糕的设计。

但我不明白差异是什么...我只想用类似于@year-parameter 的值更改静态代码。 "interpretation" 不应该关心 SQL 语法的验证,这只是字符串操作的问题。

还是我只是一个糟糕的 C# 编码器?

可能 addwithvalue 方法对于在 select 语句中添加动态列名无效。我认为你应该使用 c# 8.0 功能,字符串插值来解决这个问题。您可以使用字符串插值添加列名。你能试试这个方法吗:

String sYear2 = "2020";

string deccan = "decJan";

string query = $(Select {decJan} from Stats where intRecnum = (select intRecnum from Stats where intAr = @year)


query = @query;


var cmd = new SqlCommand(query, con);

cmd.Parameters.AddWithValue("@year", sYear2);