System.InvalidCastException: не удалось преобразовать значение параметра из XElement в строку

Примечание: Мне не удалось найти именно этот вопрос в поиске. Я нашел несколько похожий вопрос здесь, в Stack Overflow, который привел меня к решению. Я публикую вопрос и решение, чтобы следующему человеку, у которого возникла проблема, было легче найти решение. Я бы задал вопрос CommunityWiki, если бы это было еще возможно - я не ищу репутации от этого.


Я пытаюсь использовать ADO.NET для вызова хранимой процедуры SQL Server 2005, которая принимает параметр типа Xml :

CREATE PROCEDURE dbo.SomeProcedure(
    @ListOfIds Xml)
AS
BEGIN
    DECLARE
            @Ids TABLE(ID Int);
    INSERT INTO @Ids
    SELECT ParamValues.ID.value('.', 'Int')
    FROM @ListOfIds.nodes('/Persons/id') AS ParamValues(ID);

    SELECT p.Id,
           p.FirstName,
           p.LastName
    FROM Persons AS p
         INNER JOIN @Ids AS i ON p.Id = i.ID;
END;

Я передаю XML как объект LINQ to XML XElement

var idList = new XElement(
    "Persons",
    from i in selectedPeople
    select new XElement("id", i));

позже

SqlCommand cmd = new SqlCommand
                 {
                     Connection = conn,
                     CommandText = "dbo.SomeProcedure",
                     CommandType = CommandType.StoredProcedure
                 };
cmd.Parameters.Add(
    new SqlParameter
    {
        ParameterName = "@ListOfIds",
        SqlDbType = SqlDbType.Xml,
        Value = idList)
    });
using (var reader = cmd.ExecuteReader())
{
    // process each row
}

Ошибка в строке ExecuteReader за исключением:

System.InvalidCastException: не удалось преобразовать значение параметра из XElement в строку. ---> System.InvalidCastException: объект должен реализовывать IConvertible

Как правильно передать XElement хранимой процедуре?

5
задан John Saunders 16 December 2011 в 02:15
поделиться