簡體   English   中英

從Web服務返回的DataSet對象數組中獲取數據

[英]Getting data from array of DataSet objects returned from web service

將Web服務添加為C#項目的Web引用時,我要訪問一個Web服務。 Web服務中的特定方法采用SQL查詢字符串,並將查詢結果作為自定義類型返回。 當我添加Web服務引用時,該方法顯示為返回DataSet[]而不是自定義類型。 如果我仍然可以通過某種方式訪問​​那些DataSet對象中的查詢返回的數據,這很好。 我運行了一個特定的查詢,該查詢應返回6行; 我得到了一個包含6個元素的DataSet[]數組。 但是,當我遍歷那些DataSet對象時,它們都沒有任何表(通過DataSetTables屬性)。 是什么賦予了? 我的數據在哪里?

當我將Web服務用作Report Builder 2.0報表中的數據源時,該Web服務已經過測試並且可以工作。 我能夠將XML SOAP查詢發送到Web服務,並獲取包含我的數據的XML結果。

這是我如何獲取DataSet[]數組的示例:

var service = new MyWebService
    {
        Credentials = System.Net.CredentialCache.DefaultCredentials
    };
DataSet[] dataSets = service.MethodThatReturnsQueryResults(queryString);

// The body of this loop is skipped:
foreach (DataSet ds in dataSets.Where(ds => ds.Tables.Count > 0))
{
    // extract data from DataSet ds
}

編輯:這是添加Web參考時創建的自動生成的Reference.cs中方法的外觀:

[return: System.Xml.Serialization.XmlArrayItemAttribute("SomeCustomType")]
public System.Data.DataSet[] MethodThatReturnsQueryResults(
    string selectSQLQuery) {
        object[] results = this.Invoke("MethodThatReturnsQueryResults", 
            new object[] { selectSQLQuery});
    return ((System.Data.DataSet[])(results[0]));
}

因此,它肯定會返回System.Data.DataSet[] ,但是我想知道是否正在發生某種事情,以致於該Web服務中使用的自定義類型SomeCustomType在該自動生成的方法中未正確轉換,因此空了DataSet對象。 我不願意編輯此自動生成的方法。 我可以訪問Web服務代碼; 我應該做些什么以確保SomeCustomType可以SomeCustomTypeDataSet[]

編輯:我覺得如果我從Web服務獲得原始XML SOAP響應,我會做得更好。 如何做到這一點,而不是獲得作為DataSet[]返回的“翻譯”版本?

我結束了除去我的項目中的Web服務的參考,而是寫了一個實用工具類,用於發送SOAP請求和獲取響應回XML,由於本教程 以下是一些摘要:

public XmlDocument SendSoapRequest(XmlDocument soapRequest)
{
    var webRequest = getWebRequest();
    Stream requestStream = webRequest.GetRequestStream();
    soapRequest.Save(requestStream);
    requestStream.Close();
    WebResponse webResponse = webRequest.GetResponse();
    requestStream = webResponse.GetResponseStream();
    var soapResponse = new XmlDocument();
    soapResponse.Load(new XmlTextReader(new StringReader(
        new StreamReader(requestStream).ReadToEnd()
    )));
    return soapResponse;
}

private HttpWebRequest getWebRequest()
{
    var webRequest = (HttpWebRequest)WebRequest.Create(Url);
    webRequest.Credentials = CredentialCache.DefaultCredentials;
    webRequest.Headers.Add("SOAPAction", SoapAction);
    webRequest.ContentType = ContentType;
    webRequest.Accept = AcceptHeader;
    webRequest.Method = RequestMethod;
    return webRequest;
}

然后,我使用XPath查詢來導航返回的XmlDocument並獲取所需的數據,這些數據沒有顯示在使用Web引用時從Web服務獲取的DataSet[]中。 我已經有一個實現IXmlSerializable的類,因此一旦我使用XPath導航返回的XML,就只需將XmlReader傳遞給類的ReadXml方法,即可填充該類實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM