Можно ли отправить коллекцию идентификаторов в качестве параметра ADO.NET SQL?



Answers

Вы можете использовать SQL 2008 . Он не очень длинный, но он доступен.

Question

Например. могу ли я написать что-то вроде этого кода:

public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
    //...
    myAdoCommand.CommandText =
        "UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
    myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
    //...
}

Единственный способ, которым я знаю, - присоединиться к моему IEnumerable, а затем использовать конкатенацию строк для построения моей строки SQL.







Вы не можете передать список как один параметр SQl. Вы можете использовать string.Join (',') GUIDS, такие как «0000-0000-0000-0000, 1111-1111-1111-1111», но это было бы очень дорого накладными и субоптимальными для базы данных. И вы должны передать всю строку в виде одного конкатенированного динамического оператора, вы не можете добавить его в качестве параметра.

Вопрос:

Где вы получаете свой список идентификаторов, которые представляют неактивных клиентов?

Мое предложение - подойти к проблеме немного по-другому. Переместите всю эту логику в базу данных, например:

    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, чтобы снова представить их обратно в БД ????? Они уже там! Я что-то упускаю?






Links