2011-12-16 15 views
5

नोट: मुझे खोज में यह सटीक प्रश्न नहीं मिला। मुझे स्टैक ओवरफ्लो पर कुछ हद तक समान प्रश्न मिला, जिसने मुझे समाधान का नेतृत्व किया। मैं प्रश्न और समाधान पोस्ट कर रहा हूं ताकि समस्या वाला अगला व्यक्ति आसानी से समाधान ढूंढ सके। अगर मैं अभी भी संभव था तो मैं सवाल समुदायविकि बना सकता था - मैं इस से प्रतिनिधि की तलाश नहीं कर रहा हूं।System.InvalidCastException: XElement से पैरामीटर मान को स्ट्रिंग


मैं ADO.NET उपयोग करने के लिए एक SQL सर्वर 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; 

मैं एक्सएमएल XElement ऑब्जेक्ट में एक LINQ के रूप में एक्सएमएल पारित

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 को पास करने का सही तरीका क्या है?

+1

के संभावित डुप्लिकेट [सी #/एसक्यूएल - क्या प्रक्रियाओं में SqlDbType.Xml साथ कुछ गड़बड़ है] (http://stackoverflow.com/questions/574928/c-sql-whats-wrong-with-sqldbtype-xml प्रक्रियाओं में) –

+0

डुप्लिकेट नहीं - यह एक अलग अपवाद है। –

+1

आपको क्या समस्या है? क्या आपने कुछ कोशिश की और यह काम नहीं किया? – JsonStatham

उत्तर

9

एसक्लक्लिएंट कोड XElement को सीधे पारित करने की अनुमति नहीं देता है।

एक बात आप कर सकते हैं System.Data.SqlTypes.SqlXml class उपयोग करने के लिए एक्सएमएल पारित करने के लिए है:

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

अपने कोड के आधार पर आप जगह XmlReader एक using ब्लॉक में CreateReader कोड से लौटे पड़ सकता है।

0

जॉन सॉंडर्स के उत्तर के आधार पर मैंने दो विस्तार विधियां बनाई हैं।

public static class ExtensionMethods 
{ 
    public static void AddXml(this SqlParameterCollection theParameters, string name, XElement value) 
    { 
     theParameters.Add(new SqlParameter() 
     { 
      ParameterName = name, 
      SqlDbType = SqlDbType.Xml, 
      Value = new SqlXml(value.CreateReader()) 
     }); 
    } 

    public static void AddXml(this SqlParameterCollection theParameters, string name, string value) 
    { 
     theParameters.Add(new SqlParameter() 
     { 
      ParameterName = name, 
      SqlDbType = SqlDbType.Xml, 
      Value = new SqlXml(XElement.Parse(value).CreateReader()) 
     }); 
    } 
} 
संबंधित मुद्दे