问题描述
CREATE PROCEDURE [dbo].[spByTableNameReturnLastRowNew]
@tableName nvarchar(50)
AS
BEGIN
DECLARE @SelectLastRow NVARCHAR(100)
SET @SelectLastRow = 'SELECT TOP 1 * FROM ' + QUOTENAME(@tableName)+ ' ORDER BY AutoNo DESC'
EXECUTE(@SelectLastRow)
RETURN
END
这是可行的,但是当通过实体框架调用它时,结果变量返回 INT 数据类型我想返回行(对象)以使用数据而不是 int。
这是使用实体框架中的存储过程的代码:
var result = milestoneArhEntities.spByTableNameReturnLastRowNew(TableName);
解决方法
这里的 ORM 需要(提前)理解表格布局,以便将结果网格解释为对象。因此,你真的不能这样做:
var result = milestoneArhEntities.spByTableNameReturnLastRowNew(TableName);
因为 ORM 不可能知道这意味着什么; 个人方法通常可以配置为返回,例如,Order
(或List<Order>
)或Customer
(或List<Customer>
)等,但这并不能真正帮助您,因为表结构仅由 tableName
参数定义。
这里没有什么好的方法可以做你想做的事,但我不相信你想要的东西无论如何,在一般意义上。与内联 SQL 相比,我也不确定 SP 在这里为您做了多少。
你可以编写多个方法,即
var customer = milestoneArhEntities.GetLastCustomer();
var order = milestoneArhEntities.GetLastOrder();
它们是特定于表/类的。 ORM 应该没问题。
,我建议使用 DataTable
对象来获取数据。
DataTable table = new DataTable();
SqlConnection con = (SqlConnection)milestoneArhEntities.DataBase.Connection;
using(var cmd = new SqlCommand("spByTableNameReturnLastRowNew",con))
using(var da = new SqlDataAdapter(cmd))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("tableName",TableName);
da.Fill(table);
}