Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以发送ID';s作为ADO.NET SQL参数?_.net_Sql_Ado.net - Fatal编程技术网

是否可以发送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

和是本主题的参考资料。他们还比Vyas更详细地讨论了优缺点。E.Sommarskog针对SQL Server 2008的文章也有一个更新的版本(重点是表值参数):。我认为@RemusRusanu的评论应该有自己的答案;我发布了这样一条消息:由于你的回答中的第一句话而被否决,这通常是不正确的。我同意你问题最后的建议,不过。。。在某些情况下,可能确实可以在DB中执行所有操作,因此可能根本不会出现如何传输列表的问题。