在 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 作为其自己的项目来托管,以使其与模型隔离。
我在网站项目中引用了实体项目,并返回从 t4 模板生成的类(*.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中显式定义
是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?