使用 Codefluent 来自 SQL 服务器存储过程的简单结果列表
Simple results list from SQL Server stored procedure using Codefluent
我正在尝试弄清楚如何使用 Codefluent 获取 SQL 服务器存储过程的结果。我有一个开发良好的 CF 项目,但是有一个非常复杂的存储过程我不想胡闹。
基本上,该过程采用一系列输入参数和 table 中的 returns 行。从这个角度来看,它相当简单,尽管底层 T-SQL 并非如此。返回的列名不是基础 table 中的原始列名,这就是为什么我也希望使用原始 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
调用失败。
我确定这是我明显遗漏的东西。任何建议将不胜感激。谢谢!
映射存储过程主要有两种不同的方法。如果 return 列与实体的 属性 非常接近,您可以使用原始视图。否则,您可以使用轻量级实体,例如:
<CityAddress lightweight="true">
<CityName persistentName="Address_CityName" />
<cf:method name="LoadAllCities" body="load() raw">
SELECT $Address::CityName$ FROM $Address$
</cf:method>
</CityAddress>
附带说明一下,您还可以将存储过程映射到数据集:
<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>
如果您的问题的核心是存储过程 returns 与实体的基础 table 不同的字段名称,因此无法正确映射,您可以使用 table 原始方法中的变量。
原始方法将包含以下内容:
-- 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
感谢 Mexiantou 和 Dave,这是我创建的 CF 模型(模式),用于从 MS-SQL 存储过程中获取结果,is/was 不是由 CF 建模器创建的。
首先,我使用 SQL 查询 (field1...field-N) 返回的 FiledNames 创建了一个 CF 轻量级实体。
<cf:entity lightweight="true" name="myLWentity">
<cf:property name="field1" />
<cf:property name="field2" />
...
<cf:property name="fieldn" />
然后我创建了一个包含 CF:body 和 CF:parameter 部分的 CF:method。
<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 的结果是一个列表(属于 myLWentity),由我的SQL过程返回。
我正在尝试弄清楚如何使用 Codefluent 获取 SQL 服务器存储过程的结果。我有一个开发良好的 CF 项目,但是有一个非常复杂的存储过程我不想胡闹。
基本上,该过程采用一系列输入参数和 table 中的 returns 行。从这个角度来看,它相当简单,尽管底层 T-SQL 并非如此。返回的列名不是基础 table 中的原始列名,这就是为什么我也希望使用原始 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
调用失败。
我确定这是我明显遗漏的东西。任何建议将不胜感激。谢谢!
映射存储过程主要有两种不同的方法。如果 return 列与实体的 属性 非常接近,您可以使用原始视图。否则,您可以使用轻量级实体,例如:
<CityAddress lightweight="true">
<CityName persistentName="Address_CityName" />
<cf:method name="LoadAllCities" body="load() raw">
SELECT $Address::CityName$ FROM $Address$
</cf:method>
</CityAddress>
附带说明一下,您还可以将存储过程映射到数据集:
<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>
如果您的问题的核心是存储过程 returns 与实体的基础 table 不同的字段名称,因此无法正确映射,您可以使用 table 原始方法中的变量。
原始方法将包含以下内容:
-- 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
感谢 Mexiantou 和 Dave,这是我创建的 CF 模型(模式),用于从 MS-SQL 存储过程中获取结果,is/was 不是由 CF 建模器创建的。
首先,我使用 SQL 查询 (field1...field-N) 返回的 FiledNames 创建了一个 CF 轻量级实体。
<cf:entity lightweight="true" name="myLWentity">
<cf:property name="field1" />
<cf:property name="field2" />
...
<cf:property name="fieldn" />
然后我创建了一个包含 CF:body 和 CF:parameter 部分的 CF:method。
<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 的结果是一个列表(属于 myLWentity),由我的SQL过程返回。