首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Code流利的Server存储过程的简单结果列表

使用Code流利的Server存储过程的简单结果列表
EN

Stack Overflow用户
提问于 2017-04-12 03:20:27
回答 3查看 98关注 0票数 1

我试图弄清楚如何使用Code流利获得Server存储过程的结果。我有一个开发得很好的CF项目,但是有一个非常复杂的存储过程,我不想再胡闹了。

基本上,该过程接受一系列输入参数,并从表中返回行。从这个角度来看,这是相当简单的,尽管底层的T不是。返回的列名不是基础表中的原始列名,这就是为什么我还要使用原始CF过程的原因。

我尝试过各种各样的方法。我创建了一个视图和一个原始过程--(视图推断模型似乎喜欢这个)

代码语言:javascript
复制
<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调用中失败。

我肯定这是我错过的明显的东西。如有任何建议,将不胜感激。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-12 20:01:20

感谢Mexiantou和Dave,这是我创建的CF模型(模式),它是为了从一个MS-SQL存储过程(即/不是由CF建模器创建的)获得结果而创建的。

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

代码语言:javascript
复制
<cf:entity lightweight="true" name="myLWentity">
  <cf:property name="field1" />
  <cf:property name="field2" />
  ...
  <cf:property name="fieldn" />

然后,我用CF:body和CF:参数部分创建了一个CF:方法。

代码语言:javascript
复制
 <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的结果是由mySQLprocedure返回的( myLWentity)列表。

票数 0
EN

Stack Overflow用户

发布于 2017-04-12 08:40:54

主要有两种不同的方法来映射存储过程。如果返回列与实体的属性非常接近,则可以使用原始视图。否则,可以使用轻量级实体,如:

代码语言:javascript
复制
<CityAddress lightweight="true">
  <CityName persistentName="Address_CityName" />

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

另外,您还可以将存储过程映射到DataSet:

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

编辑

因此,您已经有了数据库中的存储过程,并且要调用它。想法仍然相同:创建一个轻量级实体和一个方法。但是,您必须表明不希望SQL生成器生成该过程。

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2017-04-12 14:51:34

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

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

代码语言:javascript
复制
-- 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43359680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档