c# - 在计算中使用 SqlParameter
问题描述
我目前正在开发一个 SQL 应用程序,并尝试使用 SqlCommand 和 SqlParameters 构建一个查询。我当前的代码如下所示:
SqlCommand command = database.connection.CreateCommand();
commandTexts = "select id, @current, @comparable, name from items oder by (@current - @comparable) desc"
SqlParameter currentParam = new SqlParameter("@current", System.Data.SqlDbType.VarChar, 9);
currentParam.Value = "price" + current;
SqlParameter comparableParam = new SqlParameter("@comparable", System.Data.SqlDbType.VarChar, 9);
comparableParam.Value = "price" + comparable;
current和可比较的值是在运行时计算的,它们是一种时间戳(每个最长 4 个字符)。我的 SQl 数据库(使用 SQL Server 2017 btw)中的数据类型是 DECIMAL(10,5)。每当我执行查询时,我都会收到一条错误消息,说“类型 varchar 和 varchar 在减法运算符中不兼容”,我只是假设这是因为查询从字面上获取 Parameter 值而不是将其用作列名故意的。例如,这些列被称为“price20_5”,“20_5”是当前的结果,价格被添加到它的前面。
现在我已经考虑了一种可能的解决方法,在中间使用另一个表并循环(因此有多个请求),或者只使用多个子选择,但由于我打算处理大量数据,这似乎真的效率低下并且可能没有必要。
我的问题是,以最干净和最有效的方式启动和运行计算的最佳方法是什么。还没有大量使用 SQL,所以我一直在寻找很酷的新技巧来改进;)
提前致谢!
解决方案
您不能参数化列名(或对象或模式)。要执行您想要的操作,您需要将名称连接到 SQL 字符串本身,注意不要允许 SQL 注入漏洞。如果列名部分都是从您的代码(不是用户输入)生成的,那通常是一个好的开始。如果这些值不需要额外的检查,那么也许只是:
commandTexts = $"select id, price{current}, price{comparable}, name from items oder by (price{current} - price{comparable}) desc";
推荐阅读
- flutter - 颤振溢出圆圈头像覆盖容器
- html - 如何使用 sed 将 CSS 样式文件内联到 HTML 文件?
- r - 从后验预测分布抽样(stan vs inla)
- html - 反应渲染问题
- flutter - 如何在flutter中包含要由您自己的包使用的文件资产
- installation - 未找到 CMake 错误变量 LIBXML2_INCLUDE_DIR (Gate-9.0)
- javascript - 检查 div 是否有类然后动画
- typo3 - 在 fe_users 中自动填写字段名称
- objective-c - “AXUIElementCopyAttributeValues”返回“kAXErrorAPIDisabled”
- php - 排队的 Laravel 通知卡在 AWS SQS 上