【发布时间】: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