2014-04-11 104 views
0

我有一個場景,我創建了一個Web服務,它返回傳遞的用戶名的名字和姓氏通過客戶端(webservice消費者)。Webservices:不能隱式地將類型'System.Xml.Linq.XElement'轉換爲'System.Xml.XmlElement'

但即時得到在5日線的錯誤:無法隱式轉換類型「System.Xml.Linq.XElement」到「System.Xml.XmlElement」

下面是使用檢索數據

protected void BindUserDetails(string userName) 
    { 
     UserService.ServiceSoapClient client = new UserService.ServiceSoapClient(); 
     DataSet dsresult = new DataSet(); 
     XmlElement exelement = client.GetUserDetails(userName); 
     if (exelement != null) 
     { 
      XmlNodeReader nodereader = new XmlNodeReader(exelement); 
      dsresult.ReadXml(nodereader, XmlReadMode.Auto); 
      gvUserDetails.DataSource = dsresult; 
      gvUserDetails.DataBind(); 
     } 
     else 
     { 
      gvUserDetails.DataSource = null; 
      gvUserDetails.DataBind(); 
     } 
    } 
代碼

UserService是我添加的服務引用。 gvUserDetails是在GridView

[WebMethod] 
    public XmlElement GetUserDetails(string username) { 

     SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["TestingCS"].ConnectionString); 
     cn.Open(); 
     SqlCommand cmd = new SqlCommand("select * from userInfo where [email protected]", cn); 
     cmd.Parameters.AddWithValue("@username", username); 
     cmd.ExecuteNonQuery(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     cn.Close(); 
     XmlDataDocument xmldata = new XmlDataDocument(ds); 
     XmlElement xmlElement = xmldata.DocumentElement; 
     return xmlElement; 



    } 

感謝

+0

很可能'GetUserDetails'返回'XElement',所以使用LINQ to XML代替。就個人而言,我更喜歡使用舊的DOM API :) –

+0

代理代碼是什麼樣的?如果*客戶端* GetUserDetails方法返回'XmlElement',那麼你的原始編譯錯誤是沒有意義的。 –

+0

(另外,你應該在你的web方法中使用'using'語句...) –

回答

2

那麼錯誤信息似乎相當清楚 - GetUserDetails將返回XElement(從LINQ到XML),而不是XmlDocument(從舊API)。

這應該不是問題,因爲基本上你只需要選擇一個元素並從中創建一個XmlReader。它看起來像你的代碼可能會被更改爲:

protected void BindUserDetails(string userName) 
{ 
    UserService.ServiceSoapClient client = new UserService.ServiceSoapClient(); 
    XElement element = client.GetUserDetails(userName); 
    if (element != null) 
    { 
     DataSet dsresult = new DataSet(); 
     XmlReader reader = element.CreateReader(); 
     dsresult.ReadXml(reader, XmlReadMode.Auto); 
     gvUserDetails.DataSource = dsresult; 
    } 
    else 
    { 
     gvUserDetails.DataSource = null; 
    } 
    gvUserDetails.DataBind(); 
} 

你可能重構進一步提取「轉換XElementDataSet」功能:

// You could *consider* making this an extension method 
public static DataSet ToDataSetOrNull(XElement source) 
{ 
    if (source == null) 
    { 
     return null; 
    } 
    DataSet result = new DataSet(); 
    result.ReadXml(source.CreateReader(), XmlReadMode.Auto); 
    return result; 
} 

那麼你BindUserDetails代碼只是:

protected void BindUserDetails(string userName) 
{ 
    UserService.ServiceSoapClient client = new UserService.ServiceSoapClient(); 
    gvUserDetails.DataSource = ToDataSetOrNull(client.GetUserDetails(userName)); 
    gvUserDetails.DataBind(); 
} 

...如果您有其他「BindXyzDetails」方法,它們將會類似地縮短。

+0

---我感謝你的時間......第一個解決方案在執行過程中返回了一個錯誤「CS0029:不能隱式地將類型'System.Xml.XmlElement'轉換爲'System.Xml.Linq.XElement'」,這是反向的我發佈的問題。 第二個解決方案返回「CS1502:'_Default.ToDataSetOrNull(System.Xml.Linq.XElement)'的最佳重載方法匹配'有一些無效參數」 – Itniv

+0

@Phanindra:它不喜歡執行錯誤 - 聽起來像編譯錯誤。但是錯誤沒有任何意義 - 如果你將鼠標懸停在GetUserDetails上,它會顯示什麼樣的返回類型? –

+0

抱歉,我的錯誤是它的編譯錯誤。 我想只有我的網絡方法有問題..我已經更新了我的問題。 – Itniv

相關問題