【问题标题】:passing columnname with a parameter SQLcommand使用参数 SQLcommand 传递列名
【发布时间】:2020-02-04 15:28:04
【问题描述】:

我一直在谷歌上搜索一些我不太明白的东西。 总之我的问题是这样的;

当使用这个时;

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 的值更改静态代码。 “解释”不应该关心 SQL 语法的验证,这只是字符串操作的问题。

还是只是我的 C# 编码不好?

【问题讨论】:

  • 这是糟糕的设计,不能将表名或列名作为参数传递。 SQL 查询中的模式相当于强类型语言中的类型。查询不直接执行。根据特定表、列、索引和数据统计,它们被编译成使用多种数据访问策略、匹配算法和缓存的执行计划。如果表足够小,服务器可能会将所有表加载到内存中并用于查找。或者它可能使用不同的连接策略,例如循环与哈希连接
  • 表和列、类型和索引等价于强类型语言中的类型。如果你改变它们,你就彻底改变了程序。在这种情况下,程序就是执行计划
  • 在尝试使用 c# 之前,我会使用 SQL Server Management Studio 来测试查询。 SSMS 错误消息比 c# 好得多,通常会解决这些问题。

标签: c# parameters sqlcommand


【解决方案1】:

可能 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);

【讨论】:

  • 不知道这个解决方案是否适合“糟糕的设计”,但这正是我所追求的。在将字符串发送到执行之前对其进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
相关资源
最近更新 更多