注:検索でこの正確な質問を見つけることができませんでした。ここでスタックオーバーフローで似たような質問を見つけたので、解決策にたどり着きました。問題を抱えている次の人がより簡単に解決策を見つけられるように、質問と解決策を投稿しています。それがまだ可能であれば、私はCommunityWikiに質問したでしょう-私はこれからの担当者を探していません.
Xml
ADO.NET を使用して、次の型のパラメーターを受け入れる 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: パラメータ値を XElement から文字列に変換できませんでした。---> System.InvalidCastException: オブジェクトは IConvertible を実装する必要があります
XElement
をストアド プロシージャに渡す正しい方法は何ですか?