繁体   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