4

好的,我对这个感到困惑,因为我没有得到语法并且需要一些指导。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

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

  1. 我在一个库项目中使用 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; }
        }
    
  2. 然后,我在网站 WCF 项目中创建了一个接口和实现,以使用 basicHttpBinding 作为其自己的项目来托管,以使其与模型隔离。

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

  4. 我的界面是这样的:

    [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;
    }
    
  5. 我对返回的实现如下,一个仅将模型原样实现为返回,另一个说明来自“数据合同”的显式值,因此它不会生成可为空的类型。

    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();
            }
        }
    
  6. 我将它发布到我在 Windows 7 Enterprise 上的 IIS 7.5 上的本地主机上的应用程序下到我的默认站点“报告”,端点是:

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

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

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

  9. 我去 BIDS 并在步骤 6 中设置带有端点的数据源以连接 XML 类型并将其称为 WCF 数据源

  10. 我正在测试 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>
    
4

1 回答 1

0

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

<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/dataItems{state(string)}
</ElementPath>
</Query>

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

于 2016-04-05T19:36:09.950 回答