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
相关产品推荐
相关产品推荐

