使用Codefluent从SQL Server存储过程列出简单结果

时间:2017-04-12 03:20:28

标签: sql-server stored-procedures codefluent

我试图弄清楚如何使用Codefluent获取SQL Server存储过程的结果。我有一个完善的CF项目,但有一个非常复杂的存储过程,我不想跟你说。

基本上,该过程采用一系列输入参数并从表中返回行。从这个角度来看,它很简单,尽管底层的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来电时失败。

我确定这是显而易见的,我不知道。任何建议将不胜感激。谢谢!

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

如果问题的核心是存储过程返回的字段名不同于实体的基础表,因此无法正确映射,则可以使用raw方法中的表变量来克服该问题。

原始方法将包含以下内容:

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

答案 2 :(得分:0)

感谢Mexiantou和Dave,这是我创建的CF模型(模式),用于从CF建模器创建的MS-SQL存储过程中获取结果。

首先,我创建了一个CF轻量级实体,其中包含SQL查询返回的FiledNames(field1 ... field-N)。

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

然后我用CF创建了一个CF:方法:body和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> 

有一点需要注意:原始文本(&#34; Select * from ...&#34;)程序名称似乎被忽略,因此它可以是任何东西。相反,它使用CF:persistenceName,它是未由建模者创建的存储过程的名称(请注意cfps:produce =&#34; false&#34;)。

调用myLWentity.LoadmyLWentity的结果是mySQLprocedure返回的(myLWentity)列表。