gpt4 book ai didi

c# - 系统.InvalidCastException : Failed to convert parameter value from a XElement to a String

转载 作者:太空狗 更新时间:2023-10-29 22:33:49 33 4
gpt4 key购买 nike

注意:我无法在搜索中找到这个确切的问题。我在 Stack Overflow 上发现了一个类似的问题,这让我找到了解决方案。我发布了问题和解决方案,以便下一个有问题的人可以更轻松地找到解决方案。如果仍然可能的话,我会提出问题 CommunityWiki - 我不是在寻找代表。


我正在尝试使用 ADO.NET 调用接受 Xml 类型参数的 SQL Server 2005 存储过程:

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: Failed to convert parameter value from a XElement to a String. ---> System.InvalidCastException: Object must implement IConvertible

XElement 传递给存储过程的正确方法是什么?

最佳答案

SqlClient 代码不允许直接传递 XElement。

您可以做的一件事是使用 System.Data.SqlTypes.SqlXml class传递 XML:

cmd.Parameters.Add(
new SqlParameter
{
ParameterName = "@ListOfIds",
SqlDbType = SqlDbType.Xml,
Value = new SqlXml(idList.CreateReader())
});

根据您的代码,您可能需要将从 CreateReader 代码返回的 XmlReader 放入 using block 中。

关于c# - 系统.InvalidCastException : Failed to convert parameter value from a XElement to a String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8529019/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com