在 XML 查询中显式定义数据类型,以便 s-s-rS 从 WCF 服务中识别

Posted

技术标签:

【中文标题】在 XML 查询中显式定义数据类型,以便 s-s-rS 从 WCF 服务中识别【英文标题】:Define DataTypes explicitly in XML Query for s-s-rS to recognize from WCF servcie 【发布时间】:2013-05-25 00:54:21 【问题描述】:

好吧,我被这个难住了,因为我没有掌握语法并且需要一些指导。 s-s-rS 的 XML Query 结构用于查询 xml 结构或 WCF 服务。我让它工作正常,但数据类型不是它们在 WCF 服务上定义的,所以我需要在它们过来之后转换它们。有什么办法可以先做到这一点吗?

我假设我已经看到了这篇 MSDN 文章: http://msdn.microsoft.com/en-us/library/ms365158%28v=sql.105%29.aspx

但是我迷路了,因为我的结构来自生成的“DataContract”,我申请了“ServiceContract”,无论我尝试什么,我都无法协商结构。我要么全部得到,要么一无所获。

用最简单的话来说:“如何使用 xml 查询方法在 s-s-rS 中将文本值显式转换为整数”?核心问题是我想做一个矩阵报告,我可以这样做:

行是:'状态' 列是:'Adjudication_Type' 值为:(表达式)=sum(CINT(Fields!Volume.Value))

但恕我直言,这是一种解决方法,数据应该是合同中定义的数据,否则当客户端在 s-s-rS 中定义数据时,它有能力使其成为正确的类型。前几天我在 WCF 到 s-s-rS 方面遇到了其他问题,并且在这个线程中做了一个解决方法:QUERY method of Soap request for s-s-rS and WCF testing

让我们来看看我的创建和实现

    我在一个库项目中使用 C# 中的 Entity Framework 5 在 .NET 4.5 中创建了一个实体模型,以使其与数据的模型部分保持隔离。从 t4 为数据生成的基本模型是这样建模的类:

    public partial class fMonthlyImpactedVolume_Result
        
            public string state  get; set; 
            public string ADJUDICATION_TYPE  get; set; 
            public Nullable<int> Yr  get; set; 
            public Nullable<int> Mn  get; set; 
            public Nullable<int> VOLUME  get; set; 
            public Nullable<decimal> QSI_FEES  get; set; 
            public Nullable<int> ActivityDays  get; set; 
        
    

    然后,我在网站 WCF 项目中创建了一个接口和实现,以使用 basicHttpBinding 作为其自己的项目来托管,以使其与模型隔离。

    我在网站项目中引用了实体项目,并返回从 t​​4 模板生成的类(*.tt = 我理解的类似于 POCO 类生成器)

    我的界面是这样的:

    [ServiceContract]
    public interface IReportingService
    
        [OperationContract]
        List<fMonthlyImpactedVolume_Result> GetMonthlyData(string aStart, string aEnd);
    
        [OperationContract]
        List<MonthlyType> GetMonthlyData2(string aStart, string aEnd);
    
    
    
    [DataContract]
    public class MonthlyType
    
        [DataMember(Order = 0)] 
        public string state;
    
        [DataMember(Order = 1)]
        public string AdjudicationType;
    
        [DataMember(Order = 2)]
        public int Yr;
    
        [DataMember(Order = 3)]
        public int Mn;
    
        [DataMember(Order = 4)]
        public int Volume;
    
        [DataMember(Order = 5)]
        public decimal QSI_Fees;
    
        [DataMember(Order = 6)]
        public int ActivityDays;
    
    

    我的返回实现如下,其中一个仅将模型原样实现为返回,另一个说明来自“数据协定”的显式值,因此它不会生成可为空的类型。

    public List<fMonthlyImpactedVolume_Result> GetMonthlyData(string aStart, string aEnd)
        
            using (s-s-rSReportsEntities re = new s-s-rSReportsEntities())
            
                DateTime dstart = DateTime.Parse(aStart);
                DateTime dend = DateTime.Parse(aEnd);
    
                return re.fMonthlyImpactedVolume(dstart, dend, null).ToList();
            
        
    
        public List<MonthlyType> GetMonthlyData2(string aStart, string aEnd)
        
            using (s-s-rSReportsEntities re = new s-s-rSReportsEntities())
            
                DateTime dstart = DateTime.Parse(aStart);
                DateTime dend = DateTime.Parse(aEnd);
    
                return re.fMonthlyImpactedVolume(dstart, dend, null)
                        .Select(m => new MonthlyType
                            
                                state = m.state,
                                AdjudicationType = m.ADJUDICATION_TYPE,
                                Yr = (int) (m.Yr ?? 0),
                                Mn = (int) (m.Mn ?? 0),
                                Volume = (int) (m.VOLUME ?? 0),
                                QSI_Fees = (decimal) (m.QSI_FEES ?? 0),
                                ActivityDays = (int) (m.ActivityDays ?? 0)
                            )
                         .ToList();
            
        
    

    我将此发布到我在 Windows 7 Enterprise 上的 IIS 7.5 上的本地主机上的应用程序下到我的默认站点“报告”,端点是:

    http:// (localhost)/Reporting/ReportingService.svc

    我为客户的 C# 解决方案创建了另一个项目。我添加了两个服务引用。一种用于发现服务项目以动态测试它。另一个服务一旦发布。我检查了端点绑定,它们工作正常。

    我在客户端上测试了端点,它们对于项目中的所有三种方法都按预期工作并发布参考。太好了。

    我去 BIDS 并在步骤 6 中设置一个带端点的数据源,用于 XML 类型的连接,并将其称为 WCF 数据源

    我正在测试 1 或 2 的方法,但它们都不会转移我定义的类型。这就是问题所在。

    < Query>
    < Method Name="GetMonthlyData2" Namespace="http://tempuri.org/">
    < Parameters>
    < Parameter Name="aStart"></Parameter>
    < Parameter Name="aEnd"></Parameter>
    </Parameters>
    </Method>
    < SoapAction>
    http://tempuri.org/IReportingService/GetMonthlyData2
    </SoapAction>
    < ElementPath>
    // From my reading SOMETHING should magically identify types here but I can't get 
    // ANYTHING to work like ./Volume, Volume, Document/Volume, Root/Volume
    </ElementPath>
    </Query>
    

【问题讨论】:

在 s-s-rS 中查询 XML 数据时,您需要为查询中的每个字段提供数据类型。 人们如何以及为什么在 cmets 中用一句话回答两岁以上的问题? 【参考方案1】:

第一步是确保您通过简单的查询从该服务请求中获取数据,而无需尝试定义如下数据类型:

<Query>
<Method Name="GetMonthlyData2" Namespace="http://tempuri.org/">
<Parameters>
<Parameter Name="aStart">
       <DefaultValue>1/1/2016</DefaultValue>
</Parameter>
<Parameter Name="aEnd">
       <DefaultValue>2/1/2016</DefaultValue>
</Parameter>
</Parameters>
</Method>
<SoapAction>
http://tempuri.org/IReportingService/GetMonthlyData2
</SoapAction>
 <ElementPath IgnoreNamespaces="true">*</ElementPath>
</Query>

如果您要取回数据,您可能能够弄清楚 fiddler 中的响应是什么样子,然后尝试查询正确的结构并单独定义每个字段的类型,如下所示:

<Query>
<Method Name="GetMonthlyData2" Namespace="http://tempuri.org/">
<Parameters>
<Parameter Name="aStart">
       <DefaultValue>1/1/2016</DefaultValue>
</Parameter>
<Parameter Name="aEnd">
       <DefaultValue>2/1/2016</DefaultValue>
</Parameter>
</Parameters>
</Method>
<SoapAction>
http://tempuri.org/IReportingService/GetMonthlyData2
</SoapAction>
 <ElementPath IgnoreNamespaces="true">
GetMonthlyData2Response/GetMonthlyData2Result/dataItemsstate(string)
</ElementPath>
</Query>

找出这条路径的一种方法是查看 fiddler 中来自对服务的良好请求的原始响应。如果您安装了提琴手,您可以使用 WCFTestClient,将您的配置更改为在您的 http 端点上的 WCFTestClient 中使用端口 8888。在 WCFTestClient 中发出请求。您将在提琴手中看到该请求。转到 fiddler 中的 Composer 选项卡,然后将成功的请求拖放到 Composer 中,然后单击 Inspectors 选项卡,然后单击 Inspector 中的 TextView 选项卡。响应信封会让您了解元素路径的外观。

【讨论】:

以上是关于在 XML 查询中显式定义数据类型,以便 s-s-rS 从 WCF 服务中识别的主要内容,如果未能解决你的问题,请参考以下文章

在案例查询中显式转换枚举

sequelize抛出错误方言需要在express js中显式定义

是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?

在 python3.x 中显式继承“类型”以实现元类

id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?

C#编程(四十一)----------用户定义的数据类型转换