2017-04-12 56 views
1

我想弄清楚如何使用Codefluent獲取SQL Server存儲過程的結果。我有一個很好開發的CF項目,但是有一個非常複雜的存儲過程,我不想隨意使用它。使用Codefluent從SQL Server存儲過程簡單的結果列表

基本上,該過程需要一系列輸入參數並從表中返回行。從這個角度來看,它非常簡單,但底層的T-SQL卻不是。返回的列名不是基礎表中的原始列名,這就是爲什麼我也在尋找使用原始CF過程的原因。

我試過了各種方法。我創建了一個視圖和原始程序 - (視圖推斷模型似乎很喜歡這一個)

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

這失敗的ExecuteReader通話。

我敢肯定,這是明顯的東西我失蹤。任何建議將不勝感激。謝謝!

+0

以下知識庫文章可能會有用https://softfluent.com/product/codefluent-entities/knowledge-center/exposing-legacy-stored-procedures-as-entities – Dave

回答

0

由於Mexiantou和Dave,這是我創建,以獲得從一個MS-SQL存儲過程是結果CF模型(圖案)/不由CF建模師創建。

首先,我用SQL查詢返回的FiledNames(field1 ... field-N)創建了一個CF輕量級實體。

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

然後我用CF:body和CF:參數部分創建了一個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> 

有一點要注意:原始文本(從「選擇... *」)過程名稱似乎被忽略,因此它可以是任何東西。相反,它使用CF:persistenceName,它是未由建模者創建的存儲過程的名稱(注意cfps:produce =「false」)。

調用myLWentity的結果。LoadmyLWentity是由mySQLprocedure返回的(myLWentity的)列表。

1

映射存儲過程主要有兩種方法。如果返回列對實體的屬性非常接近,則可以使用原始視圖。否則,你可以使用一個輕量級的實體,如:

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

編輯

所以,您已經在數據庫中存儲了該過程,並且想要調用它。這個想法仍然是一樣的:創建一個輕量級的實體和方法。但是,您必須指出您不希望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]不映射到CF實體屬性名稱。 我只想調用帶有幾個輸入參數的存儲過程,並讓它返回一個視圖或非持久性實體集合或列表,其中包含與存儲過程屬性名稱匹配的屬性名稱。 –

+0

我修改了我的答案 – meziantou

0

如果你的問題的核心是存儲過程比你的實體的基礎表返回不同的字段名稱,因此不會正確映射,可以克服使用原始方法內表變量。

原始方法將包含以下:

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

Thanks Dave ...我會試試看。 –

相關問題