2017-04-12 1 views
1

Codefluentを使用してSQL Serverストアドプロシージャの結果を取得する方法を理解しようとしています。私はよく発達したCFプロジェクトを持っていますが、非常に複雑なストアドプロシージャが1つありますが、私はそれを猿のようにしたくありません。Codefluentを使用したSQL Serverストアドプロシージャの単純な結果リスト

基本的に、プロシージャは一連の入力パラメータを取り、テーブルから行を返します。この観点からは、基本的なT-SQLはそうではありませんが、かなり単純です。返される列名は、基礎となる表の元の列名ではないため、生のCFプロシージャーも使用する予定です。

私はさまざまなアプローチを試みました。これはExecuteReader呼び出しに失敗した(ビュー推論モデルはこの1つが好きなように見えた)

<cf:view autoLightweight="true" name="myLWview"> 
<cf:viewProperty name="field1" /> 
<cf:viewProperty name="field2" /> 
    ... 
<cf:viewProperty name="fieldn" /> 
</cf:view> 
<cf:method name="GetLog" returnTypeName="list(of myLWview)"> 
<cf:body text="RAW (parameter1, parameter2, ..., parametern)" rawText="select [field1], [field2], ... , [fieldn] from mySQLprocedure" language="tsql" /> 
</cf:method> 

- 私は、ビューと生プロシージャを作成しました。

私はそれが明らかであると確信しています。アドバイスをいただければ幸いです。ありがとう!

+0

次のナレッジベースの記事は役に立ちますhttps://softfluent.com/product/codefluent-entities/knowledge-center/exposing-legacy-stored-procedures-asentent – Dave

答えて

0

おかげで、これは私が/なかったれるMS-SQLストアドプロシージャの結果を得るために作成されたCFモデル(パターン)でありますCFモデラーによって作成されます。

まず、SQLクエリ(field1 ... field-N)によって返されたFiledNamesでCF軽量エンティティを作成しました。

<cf:entity lightweight="true" name="myLWentity"> 
    <cf:property name="field1" /> 
    <cf:property name="field2" /> 
    ... 
    <cf:property name="fieldn" /> 

次に、CF:bodyとCF:parameterセクションでCF:メソッドを作成しました。注意すべき

<cf:method name="LoadmyLWentity" cfps:produce="false" 
    persistenceName="mySQLprocedure" > 
    <cf:body text="LOAD RAW" rawText="Select * from [dbo].ThisDoesntSeemToMatter]" language="tsql" /> 
     <cf:parameter typeName="..." name="parameter1" /> 
     <cf:parameter typeName="..." name="parameter2" /> 
       ... 
     <cf:parameter typeName="..." name="parametern" /> 
</cf:method> 
</cf:entity> 

一つのこと:生のテキスト(「SELECT * FROM ...」)プロシージャ名が、それは何もすることができますので、無視しているようです。代わりに、モデラーによって作成されなかったストアドプロシージャの名前であるCF:persistenceNameを使用します(cfps:produce = "false"に注意してください)。

myLWentityを呼び出した結果です。LoadmyLWentityは、mySQLプロシージャによって返される(myLWentityの)リストです。

1

主に、ストアドプロシージャをマップする2つの異なる方法があります。リターン列がエンティティのプロパティに対してかなり閉じている場合は、Rawビューを使用できます。そうでなければ、あなたのような軽量エンティティを使用することができます。注意点として

<CityAddress lightweight="true"> 
    <CityName persistentName="Address_CityName" /> 

    <cf:method name="LoadAllCities" body="load() raw"> 
    SELECT $Address::CityName$ FROM $Address$ 
    </cf:method> 
</CityAddress> 

、あなたはまた、DataSetにストアドプロシージャをマップすることができます。

<cf:method name="Custom" returnTypeName="System.Data.DataSet"> 
    <cf:body text="RAW" rawText="SELECT $Customer{Columns}$ FROM $Customer$" language="tsql" /> 
</cf:method> 

EDIT

ので、データベースにストアドプロシージャが既にあり、それを呼び出す必要があります。アイデアはまだ同じです。軽量のエンティティとメソッドを作成します。ただし、SQLプロデューサがプロシージャを生成しないように指定する必要があります。

<CityAddress lightweight="true"> 
    <CityName persistentName="Address_CityName" /> 

    <cf:method name="LoadAllCities" 
      body="load(string param1, int param2) raw" 
      cfps:produce="false" 
      persistenceName="mySQLprocedure" /> 
</CityAddress> 
+0

返信いただきありがとうございます。 –

+0

この方法では、元のストアドプロシージャを呼び出せない別のストアドプロシージャが作成されます。 結果を取得しようとしているストアドプロシージャは、複数のテーブルに結合されていますが、そのうちのいくつかはCFモデルの一部ではありません。また、Select [fieldname] sプロシージャは、CFエンティティのプロパティ名にマップしません。 私はいくつかの入力パラメータを持つストアドプロシージャを呼び出して、ストアドプロシージャのプロパティ名と一致するプロパティ名を持つビューまたは非永続エンティティコレクションまたはリストを返すようにしたいと思います。 –

+0

私は私の答えを編集しました – meziantou

0

問題の核心は、ストアドプロシージャを正しくマップしませんので、あなたのエンティティの基礎となる表とは異なるフィールド名を返し、ある場合、あなたは生のメソッド内でテーブル変数を使用していることを克服することができます。

生方法は、以下を含むであろう:MexiantouとDaveに

-- Create table variable that matches field names of your entity's table 
declare @customerTableVar as table 
(
Customer_Id int, 
Customer_Name nvarchar(128) 
) 

-- Populate table variable using existing stored procedure 
INSERT INTO @customerTableVar 
EXEC ('sp_ExistingGetCustomerStoredProcedure') 

-- Outputs the results of the table variable. 
SELECT * FROM @customerTableVar 
+0

おかげさまでデイブ...私はそれを試してみましょう。 –

関連する問題