我试图弄清楚如何使用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
来电时失败。
我确定这是显而易见的,我不知道。任何建议将不胜感激。谢谢!
答案 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)列表。