Примечание: Мне не удалось найти этот точный вопрос в поиске.Я нашел несколько похожий вопрос здесь о переполнении стека, что привело меня к решению.Я публикую вопрос и решение, чтобы следующий человек с проблемой мог легче найти решение.Я бы задал вопрос 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 как объект X-элемента LINQ to XML
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
хранимой процедуре?