You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# SqlCommand参数置于查询语句中间失效问题排查

问题分析与解决办法

嘿,我一眼就发现你代码里的两个关键问题啦,咱们一个个说:

1. 直接导致执行失败的SQL语法错误

你在DECLARE变量后的赋值语句写错了:

DECLARE @order_guid_tr uniqueidentifier 
SELECT 1 @order_guid_tr = Order_guid FROM [legal].[mdm].[View_All_Documents] WHERE legal_GUID = '" + legal_GUID + "'

这里的SELECT 1 @order_guid_tr是完全错误的语法——你多写了个1,正确的赋值写法应该是直接把字段值赋给变量:

DECLARE @order_guid_tr uniqueidentifier 
SELECT @order_guid_tr = Order_guid FROM [legal].[mdm].[View_All_Documents] WHERE legal_GUID = '" + legal_GUID + "'

这个多余的1会让SQL Server无法解析语句,自然就运行失败了。

2. 必须修复的SQL注入风险(严重安全问题)

不管你的参数在SQL语句的哪个位置,直接用字符串拼接传递参数都是绝对不可取的,这会导致严重的SQL注入漏洞,攻击者可以轻易篡改你的查询逻辑,甚至删除数据。

正确的做法是使用SqlParameter来传递参数,既安全又能避免类型转换的问题(比如uniqueidentifier类型不用手动拼接引号)。

修正后的完整代码

string[] param = getHTTPparams(connection);
// 使用参数化查询,避免SQL注入和语法错误
string sql = @"
DECLARE @order_guid_tr uniqueidentifier 
SELECT @order_guid_tr = Order_guid FROM [legal].[mdm].[View_All_Documents] WHERE legal_GUID = @LegalGUID
SELECT AD.document_GUID ,AT.attachment_fileName, document_type 
FROM [legal].[mdm].[View_All_Documents] AD 
LEFT JOIN [legal].[dbo].[AllAttachments] AT ON AD.document_GUID = AT.document_GUID 
WHERE AD.ORDER_GUID = @order_guid_tr";

SqlCommand command = new SqlCommand(sql, connection);
// 添加参数,指定类型和值
command.Parameters.Add("@LegalGUID", SqlDbType.UniqueIdentifier).Value = legal_GUID;

这样既修复了语法错误,又彻底解决了SQL注入的风险,而且不管参数在语句的哪个位置,都能稳定运行。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:43:36