是否可以发送ID';s作为ADO.NET SQL参数?
我能写一些像这样的代码吗:是否可以发送ID';s作为ADO.NET SQL参数?,.net,sql,ado.net,.net,Sql,Ado.net,我能写一些像这样的代码吗: public void InactiveCustomers(IEnumerable<Guid> customerIDs) { //... myAdoCommand.CommandText = "UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)"; myAdoCommand.Parameters["@CustomerIDs"].Value
public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
//...
myAdoCommand.CommandText =
"UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
//...
}
公共客户(IEnumerable CustomerID)
{
//...
myAdoCommand.CommandText=
“更新客户集活动=0,其中CustomerID位于(@CustomerID)”;
myAdoCommand.Parameters[“@CustomerIDs”].Value=CustomerIDs;
//...
}
我知道的唯一方法是加入我的IEnumerable,然后使用字符串连接来构建我的SQL字符串。不。参数就像SQL值一样,基本上只能有一个
正如您可能知道的,生成SQL字符串是一项风险很大的工作:您将自己置于一个错误的环境中。只要您处理的是真正的GUID,您就应该很好,否则您需要确保清除您的输入 不能将列表作为单个SQl参数传递。您可以将诸如“0000-0000-0000-0000,1111-1111-1111-1111-1111”之类的guid字符串连接到(“,”)中,但这会增加数据库开销,实际上是次优的。您必须将整个字符串作为单个串联动态语句传递,不能将其作为参数添加 问题: 您从哪里获得代表非活跃客户的ID列表 我的建议是以稍微不同的方式处理这个问题。将所有逻辑移到数据库中,例如:
Create procedure usp_DeactivateCustomers
@inactive varchar(50) /*or whatever values are required to identify inactive customers*/
AS
UPDATE Customer SET c.Active = 0
FROM Customer c JOIN tableB b ON c.CustomerID = b.CustomerID
WHERE b.someField = @inactive
并将其称为存储过程:
public void InactiveCustomers(string inactive)
{
//...
myAdoCommand.CommandText =
"usp_DeactivateCustomers";
myAdoCommand.Parameters["@inactive"].Value = inactive;
//...
}
如果数据库中存在GUID列表,为什么需要:查找它们;把它们放在一个通用列表中;将列表展开为一个CSV/XML/Table变量,只是为了再次将它们显示回DB?????他们已经在那里了!我遗漏了什么吗?通常,这样做的方法是传入一个逗号分隔的值列表,然后在存储过程中解析该列表并将其插入临时表中,然后将其用于连接。从Sql Server 2005开始,这是处理需要保存数组的参数的标准做法 下面是一篇关于处理此问题的各种方法的好文章: 但是对于Sql Server 2008,我们最终可以将表变量传递到过程中,首先将表定义为自定义类型 本文对此(以及更多2008年的功能)进行了很好的描述:
您可以使用。虽然发布时间不长,但它是可用的。您可以使用xml参数类型:
CREATE PROCEDURE SelectByIdList(@productIds xml) AS
DECLARE @Products TABLE (ID int)
INSERT INTO @Products (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @productIds.nodes('/Products/id') as ParamValues(ID)
SELECT * FROM
Products
INNER JOIN
@Products p
ON Products.ProductID = p.ID
如前所述,Erland Sommarskog就此主题撰写了一系列文章(链接到下面)。文章非常详尽,可以作为参考资料。虽然它们特定于SQL Server(T-SQL),但提到的一些技术也可能适用于其他RDBMS(例如使用XML
数据类型):
- :
- 表值参数(TVP)
- :
- 标量值的字符串序列化和反序列化
- SQLCLR
- 通过XML数据类型传递结构化列表数据
- 动态SQL