.net SQL选择列表中值的位置<;字符串>;
是否有一种方法可以针对具有指向ArrayList或List的where子句的数据源(可以是sql、oracle或access)创建查询 例如:.net SQL选择列表中值的位置<;字符串>;,.net,sql,ado.net,.net,Sql,Ado.net,是否有一种方法可以针对具有指向ArrayList或List的where子句的数据源(可以是sql、oracle或access)创建查询 例如: Select * from Table where RecordID in (RecordIDList) 我已经看到了一些使用Linq的方法,但是如果可以避免的话,我不想使用它。您可以使用String.Join。试着这样做: String query = "select * from table where RecordId in ({0});"; S
Select * from Table where RecordID in (RecordIDList)
我已经看到了一些使用Linq的方法,但是如果可以避免的话,我不想使用它。您可以使用
String.Join
。试着这样做:
String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));
作为旁注,这不会保护您免受SQL注入的影响-希望本示例将为您指明正确的方向。如果您使用动态SQL,则可以将括号的内容作为逗号分隔的文本列表发送。否则,可以使用XML变量发送多个值。请参见我只做了您试图用逗号分隔的列表所做的事情
Select * from Table where RecordID in (1,2,34,45,76,34,457,34)
或者结果来自单独的选择
Select * from Table where RecordID in (select recordId from otherTable where afieldtype=1)
我很确定您无法实现您所追求的目标….Linq to Sql。记录列表应该是
列表
,而不是数组列表
或列表列表
Linq将根据需要生成尽可能多的参数。一些数据库实现在可接受的参数数量上受到限制。SqlServer2005的限制是略多于2000个参数。。。因此,不要使用包含超过2000个元素的列表。使用Linq to SQL,我假设实体框架可以执行以下操作:
dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));
将使用List和ArrayList,因为它们都实现IEnumerable
Linq和Lambdas要求您反转Contains方法,但它确实起作用并生成SQL“IN()”子句。请注意Linq to SQL=dead,来源: 实体框架是您当前应该使用的,如果您想要实现这样的体系结构 此外,如果您正在为“in”子句使用另一个select查询(如GordonB建议),则最好使用“exists”而不是“in”,例如:
select * from tablename where exists (select id from othertablename where fieldtype=1)
您可以编写一个表值用户定义函数,该函数接受ID列表并创建一个表,然后重新连接该函数的结果。这描述了如何做 或者,您可以使用SQL server 2008中新增的表参数(我认为) 或者,正如Manu所说,您可以使用XML
但是,我建议不要在接受的答案中使用IN-String.Join方法,因为这类似于请求SQL注入。您可以迭代数组,并为每个数组向SQL添加一个参数。这可以让您了解SQL注入,但在构建SQL语句时,请确保使用StringBuilder而不是strign连接 e、 g
StringBuilderSQL=newStringBuilder(“从表中选择*);
for(int i=0;i0)sql.Append(“或”);
Append(“RecordID=@param”+i.ToString()+”;
IDbDataParameter param=新参数();
参数值等。
}
您可以使用一个颜色字符串列表的示例,用逗号分隔:
SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''
选择值
来自字符串_SPLIT('红色、绿色、蓝色'、'、')
其中修剪(值)'
string.Join的签名实际上是(string,string[]),因此调用看起来更像string.Join(“,”,list.ToArray())。我要比您的语句“不会保护您免受SQL注入”更进一步,并说这些东西是所有SQL注入之母。当然,在一般情况下,通过字符串连接构建SQL查询是一个坏主意,但是如果记录ID列表是一个强类型的整数列表,这种方法的SQL注入风险为零。JoelHess没有询问LinqToSql。。。这个问题包括Oracle,因此LinqToSql应该被该要求排除在外。
select * from tablename where exists (select id from othertablename where fieldtype=1)
StringBuilder sql = new StrignBuilder("select * from Table where ");
for (int i = 0; i < RecordIDLis.Length; i++)
{
if (i > 0) sql.Append (" OR ");
sql.Append(" RecordID = @param" + i.ToString() + " ");
IDbDataParameter param = new Param();
param.value etc.
}
SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''