好的,我对这个感到困惑,因为我没有得到语法并且需要一些指导。SSRS 的 XML Query 结构用于查询 xml 结构或 WCF 服务。我让它工作正常,但数据类型不是它们在 WCF 服务上定义的,所以我需要在它们过来之后转换它们。有什么办法可以先做到这一点吗?
我假设我已经看到了这篇 MSDN 文章:http: //msdn.microsoft.com/en-us/library/ms365158%28v=sql.105%29.aspx
但是我迷失了,因为我的结构来自生成的“DataContract”,我应用于我的“ServiceContract”,无论我尝试什么,我都无法协商该结构。我要么全部得到,要么一无所获。
用最简单的话来说:“如何使用 xml 查询方法在 SSRS 中将文本值显式转换为整数”?核心问题是我想做一个矩阵报告,我可以这样做:
行是:'state' 列是:'Adjudication_Type' 值是:(表达式)=sum(CINT(Fields!Volume.Value))
但恕我直言,这是一种解决方法,数据应该是合同中定义的数据,否则当客户端在 SSRS 中定义数据时,它有能力使其成为正确的类型。前几天我在 WCF 到 SSRS 方面遇到了其他问题,并且在这个线程中也做了一个解决方法:QUERY method of Soap request for SSRS 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 (SSRSReportsEntities re = new SSRSReportsEntities()) { 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 (SSRSReportsEntities re = new SSRSReportsEntities()) { 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>