我正在尝试在EF7 beta8中运行存储过程以返回特定数据。我试图通过FromSQL命令来做,但不确定这是否是正确的命令。
strSQL = wt.DataSource.StoredProc;
foreach (var p in prms)
{
strSQL = strSQL + " @" + p.Name + " = '" + p.Value + "',";
}
strSQL = strSQL.Remove(strSQL.Length - 1); //removes last comma
var test = _dbContext.Widgets.FromSql("EXEC " + strSQL).ToList();
var test2 = _dbContext.Widgets.FromSql("SELECT * FROM Widgets").ToList();
如果测试2正常工作并正确返回数据,则test1返回错误:
'FromSql'操作的结果中没有所需的列'Id'。
我假设我返回的数据不是模型的一部分。如果是这种情况,我如何执行存储过程并将原始数据返回到List或DataTable?
修改
我正在尝试使用SQLCommand:
var connection = (SqlConnection)_dbContext.Database.GetDbConnection();
var command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = strSQL;
foreach(var p in prms)
{
command.Parameters.Add("@" + p.Name, p.Value);
}
connection.Open();
var test = command.ExecuteNonQuery();
connection.Close();
公共汽车仍然没有运气:
从对象类型Newtonsoft.Json.Linq.JValue到已知的托管提供程序本机类型不存在映射。
有没有其他方法可以在不映射实体的情况下执行存储过程?
答案 0 :(得分:1)
您应该能够使用普通SqlCommand
和ExecuteReader
方法从存储过程中获取数据。
快速样本。
此代码执行名为GetWidgets的存储过程,该过程需要2个参数@name
和@categoryId
,并返回包含2列Id
和Name
的结果集。我们正在从DataReader读取值并创建一个WidgetDto
对象并附加到WidgetDto列表。
你的WidgetDto是一个简单的POCO
public class WidgetDto
{
public int Id {set;get;}
public string Name {set;get;}
}
执行存储过程的代码是
private List<WidgetDto> GetWidgets(d)
{
var catId= 1;
var name ="test"
//The above values are hard coded for demo. you may replace it
// with whatever your stored proc is expecting.
var list = new List<WidgetDto>();
const string sqlQry = "exec GetWidgets @name,@categoryId";
using (var db = new StudentsEntities())
{
using (var con = (SqlConnection) db.Database.Connection)
{
using (var cmd = new SqlCommand(sqlQry, con))
{
cmd.Parameters.AddWithValue("@name", name);
cmd.Parameters.AddWithValue("@categoryId", catId);
con.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var s = new GoodVm();
s.Id = reader.GetInt32(reader.GetOrdinal("Id"));
s.Name = reader.GetString(reader.GetOrdinal("Name"));
list.Add(s);
}
}
}
}
}
return list;
}
在这个例子中,我使用我的DbContext的db.DataBase.Connection
(在ED 6.13版本中可用)属性来构建连接。您也可以使用连接字符串从传统方式构建连接。