我试图弄清楚如何使用Code流利获得Server存储过程的结果。我有一个开发得很好的CF项目,但是有一个非常复杂的存储过程,我不想再胡闹了。
基本上,该过程接受一系列输入参数,并从表中返回行。从这个角度来看,这是相当简单的,尽管底层的T不是。返回的列名不是基础表中的原始列名,这就是为什么我还要使用原始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调用中失败。
我肯定这是我错过的明显的东西。如有任何建议,将不胜感激。谢谢!
发布于 2017-04-12 20:01:20
感谢Mexiantou和Dave,这是我创建的CF模型(模式),它是为了从一个MS-SQL存储过程(即/不是由CF建模器创建的)获得结果而创建的。
首先,我创建了一个CF轻量级实体,其中包含由SQL返回的FiledNames (field 1.field-N)。
<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> 要注意的一点是:原始文本(“Select* from .”)过程名似乎被忽略了,所以它可以是任何东西。相反,它使用CF:persistenceName,它是未由建模者创建的存储过程的名称(请注意cfps:produce="false")。
调用myLWentity.LoadmyLWentity的结果是由mySQLprocedure返回的( myLWentity)列表。
发布于 2017-04-12 08:40:54
主要有两种不同的方法来映射存储过程。如果返回列与实体的属性非常接近,则可以使用原始视图。否则,可以使用轻量级实体,如:
<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>发布于 2017-04-12 14:51:34
如果问题的核心是存储过程返回与实体的基础表不同的字段名,因此无法正确映射,则可以使用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 @customerTableVarhttps://stackoverflow.com/questions/43359680
复制相似问题