当前位置: 首页 > 编程语言 > C#

SqlCommand中的字符串列表通过C#中的参数分享

时间:2023-04-10 23:01:31 C#

C#学习教程:ListofStringsinSqlCommandSharedbyParametersinC#list...)查询的一部分。而不是循环我的字符串列表来生成我需要查询的列表(如果你认为这在sqlInjection中是危险的)。我想我可以创建一个像这样的参数:SELECTblahblahblahWHEREblahblahblahIN@LISTOFWORDS然后在代码中我尝试添加这样的参数:DataTabledt=newDataTable();dt.Columns.Add("word",typeof(string));foreach(listOfWords中的字符串单词){dt.Rows.Add(word);}comm.Parameters.Add("LISTOFWORDS",System.Data.SqlDbType.Structured).Value=dt;但这不起作用。问题:感谢您抽出宝贵时间:)您尝试做的事情是可行的,但不能使用您当前的方法。这是SQLServer2008的一个非常常见的问题,之前所有可能的解决方案都可能与性能、安全性和内存使用相关的妥协。此链接显示了SQLServer2000/2005SQLServer2008支持传递表值参数的一些方式。我希望这有帮助。您要考虑此列表的来源。通常,该信息位于某处的数据库中。例如,您可以使用这样的子查询代替:SELECT*FROM[Table]WHEREIDIN(1,2,3):SELECT*FROM[Table]WHEREIDIN(SELECTTableIDFROM[OtherTable]WHEREOtherTableID=@OtherTableID)如果我理解正确的话,您正试图将列表作为SQL参数传递。以前有人尝试过这种方法,但收效有限:PassingArraystoStoredProceduresArraysandListsinSQL2005PassingArraysofValuestoSQLServerWithoutStringManipulation使用MSSQL2005的XML特性将值列表传递给命令不,这并非不可能。您的方法不起作用(至少在.net2中)如果可能,我会尝试“JoelCoehoorn”解决方案(第二个答案)。否则,另一种选择是发送一个“字符串”参数,其中包含由定界符分隔的所有值。编写一个动态查询(从字符串中的值构建它)并使用“exec”执行它。另一种解决方案是直接从代码构建查询。像这样:StringBuildersb=newStringBuilder();for(inti=0;i命令应如下所示:SELECTblahWHEREblahIN(p0,p1,p2,p3...)...p0='aaa',p1='bbb'InMsSql2005,"IN”只使用了256个值。我建议将参数设置为逗号分隔的字符串值,并使用SQL中的Split函数将其转换为单列值表,然后就可以使用IN函数了。http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648-拆分函数如果您想将列表作为参数中的字符串传递,您可以动态构建查询。DECLARE@queryvarchar(500)SET@query='SELECTblahblahWHEREblahblahin('+@list+')'EXECUTE(@query)我曾经遇到过同样的问题,我认为现在可以直接通过ADO.NETAPI操作来做到这一点。你可以考虑插入这个词进入temptable(加上queryid或其他东西),然后从查询中引用该temptable。或者动态创建查询字符串并避免使用其他措施(如正则表达式检查)进行sql注入。这是一个老问题,但我想出了一个我喜欢重用的优雅解决方案,我认为其他人会觉得有用。首先,您需要在SqlServer中创建一个FUNCTION,它采用带分隔符的输入并返回一个表,其中的项目拆分为记录。这是这段代码:ALTERFUNCTION[dbo].[Split](@RowDatanvarchar(max),@SplitOnnvarchar(5)=',')RETURNS@RtnValuetable(Idintidentity(1,1),Datanvarchar(100))ASBEGIN声明@CntintSet@Cnt=1While(Charindex(@SplitOn,@RowData)>0)BeginInsertInto@RtnValue(data)SelectData=ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))Set@RowData=Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))Set@Cnt=@Cnt+1EndInsertInto@RtnValue(data)SelectData=ltrim(rtrim(@RowData))ReturnEND您现在可以这样做:SelectId,Datafromdbo.Split('123,234,345,456',',')不用担心,这不容易受到攻击SQL注入攻击的影响。接下来编写一个采用逗号分隔数据的存储过程,然后您可以编写一个使用此Split函数的sql语句:CREATEPROCEDURE[dbo].[findDuplicates]@idsnvarchar(max)asbeginselectIDfromSomeTablewith(nolock)whereIDin(selectDatafromdbo.Split(@ids,','))end现在你可以围绕它编写一个C#包装器:如果它对你有用并且你需要了解更多C#学习教程,我希望你将更加关注它---publicvoidSomeFunction(Listids){varidsAsDelimitedString=string.Join(",",ids.Select(id=>id.ToString()).ToArray());//...或者无论如何建立连接varcon=GetConnection();尝试{con.Open();varcmd=newSqlCommand("findDuplicates",con);cmd.Parameters.Add(newSqlParameter("@ids",idsAsDelimitedString));varreader=cmd.ExecuteReader();//....在这里做点什么。}catch(Exception){//捕获异常?}最后{con.Close();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: