4

さて、私は構文を取得しておらず、少しのガイダンスが必要なので、これに困惑しています。SSRS の XML クエリ構造は、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 への他の問題が発生し、このスレッドで回避策も実行しました: SSRS および WCF テスト用の SOAP 要求の QUERY メソッド

それでは、私の作成と実装を見てみましょう

  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. 次に、Web サイトの WCF プロジェクトでインターフェイスと実装を作成し、basicHttpBinding を独自のプロジェクトとして使用してホストし、モデルから分離した状態に保ちました。

  3. Web サイト プロジェクトでエンティティ プロジェクトを参照し、t4 テンプレートから生成されたクラスを返します (*.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. 戻り値の私の実装は次のとおりです。モデルをそのままの状態で戻り値として実装するためのもの、もう 1 つは「データ コントラクト」からの明示的な値を記述しているため、null 許容型は生成されません。

    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 のローカル ホストに、'Reporting' という既定のサイトへのアプリケーションの下で公開します。エンドポイントは次のとおりです。

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

  7. クライアント用の C# ソリューションに別のプロジェクトを作成しました。2 つのサービス参照を追加します。その場でテストするためのサービスプロジェクトの発見のための1つ。そして、公開されたサービス用にもう 1 つ。エンドポイントのバインディングを確認すると、正常に動作します。

  8. クライアントでエンドポイントをテストしたところ、プロジェクトの 3 つのメソッドすべてで期待どおりに動作し、参照が公開されました。偉大な。

  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>

データを取得している場合は、フィドラーで応答がどのように見えるかを把握し、正しい構造を照会して、以下のように各フィールドの型を個別に定義できる場合があります。

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

このパスを把握する 1 つの方法は、サービスに対して行われた適切な要求からの生の応答を fiddler で調べることです。フィドラーがインストールされている場合は、WCFTestClient を使用できます。構成を変更して、http エンドポイントの WCFTestClient でポート 8888 を使用します。WCFTestClient で要求を行います。フィドラーにリクエストが表示されます。fiddler の [Composer] タブに移動し、成功したリクエストをコンポーザーにドラッグ アンド ドロップします。次に [Inspectors] タブをクリックし、インスペクター内の [TextView] タブをクリックします。応答エンベロープは、要素パスがどのように見えるべきかについてのアイデアを提供します。

于 2016-04-05T19:36:09.950 に答える