使用ADO.NET 实体数据模型实现SQL存储过程调用
使用数据生成器时,存储过程output参数获取方法记录:
这篇文章分为两个部分,第一部分解决的参考资料,第二部分,自己的实例粘贴;
一:参考资料
使用ADO.NET 实体数据模型实现SQL存储过程调用
http://www.cnblogs.com/HappyLazyGarField/archive/2011/12/12/2285262.html
在VS2008的SP1中,加入了对实体数据模型的支持,但是我发觉对于存储过程的支持存在Bug,将存储过程映射到实体数据模型后,还是需要手动调整edmx文件中的内容才能正常使用。而在VS2010中,这个问题不再出现。然而,通过VS向导生成的存储过程方法要返回一个数据集合,即要么对应的存储过程执行后无返回值,要么只能返回一个select数据值,即便只有一行。VS2010中的“返回过程”对话框如下图所示:

从上图可以看到,除了无返回类型,无论是标量,复杂对象还是实体对象,都将对应一个数据集合,一个二维表。
那么,如果我们设计的存储过程不返回数据集合,而是OK或者说一些说明字符串,甚至于就是一个Boolean值,我们就无法使用VS的对话框进行操作了。下面列出了一个存储过程的字段以及其对应的调用程序写法。
1. 存储过程
1 ALTER PROCEDURE [dbo].[UpdateXsXj] 2 @xh VARCHAR(18) , --学号全码 3 @preXqdefine VARCHAR(8) , --上一学期定义 4 @xjztID INT , --学籍状态ID 5 @retv VARCHAR(20) OUTPUT 6 AS 7 SET @retv='没有成功' 8 9 BEGIN TRAN 10 11 12 IF(NOT EXISTS(SELECT xh FROM t_xjchghis WHERE xh=@xh AND Xqdefine=@preXqdefine)) 13 BEGIN 14 INSERT INTO dbo.t_xjchghis(xh,Xqdefine,xjztID) 15 SELECT @xh,@preXqdefine,xjztID from t_xsjbxx WHERE xh=@xh 16 IF(@@ERROR<>0) 17 BEGIN 18 ROLLBACK TRAN 19 RETURN 20 END 21 22 END 23 24 SET @retv='真的已经成功' 25 COMMIT TRAN
这个存储过程有四个变量,一个为字符串返回值,三个为输入变量。在C#下调用该存储过程并得到返回值的代码如下:
static void Main(string[] args)
{
fxjwgl_newEntities entities = new fxjwgl_newEntities();//初始化数据实体
using(System.Data.Objects.ObjectParameter abc=new System.Data.Objects.ObjectParameter("retv","没有成功"))
//生成一个新的数据变量对象
{
entities.UpdateXsXj("1031001200000", "2010", 1, abc);//调用数据实体中生成的存储过程变量方法
Console.WriteLine(abc.Value);//存储过程变量其实已经在变量中重写
Console.ReadLine();//显示存储过程OUTPUT变量
}
}
在开头所述存储过程方法参数设置对话框中,务必选择“无”数据集合返回值。使用数据实体向导生成的存储过程方法,其OUTPUT字段经常被定义成ObjectParameter类型,只有通过new一个新对象才能在存储过程方法中使用正确的参数。
二:实践粘贴
//逻辑层的调用
public ActionResult DeleteCompany()
{
try
{
CompanyDO Do = new CompanyDO();
var IDs = HttpRequestUtils.FormGuidArray("CompanyChecked").ToList();
//if (Do.Delete(IDs))
List<string> objectParameters = Do.Delete(IDs[0]);
if (Converter.ToInt( objectParameters[1],0) > 0)
{
IList<CompanyInfo> list = new CompanyDO().AllCompany.OrderBy<CompanyInfo, string>(c => c.CompanyType).Where(c => c.ParentCompany.HasValue == true).ToList();
return JsonUtil.CreateJsonResult(true, "删除成功!\n" + objectParameters[0].Replace(';','\n'), RenderPartialViewToString("CompanyControl", list));
}
return JsonUtil.CreateJsonResult(false, "删除失败!\n" + objectParameters[0].Replace(';', '\n'));
}
catch (Exception ex)
{
return JsonUtil.CreateJsonResult(false, "删除状态时出错:该公司已在运营中!");
}
}
//底层
public List<string> Delete(Guid ID)
{
//此处必须这样定义在外面,才可获取
System.Data.Objects.ObjectParameter Deletelog = new System.Data.Objects.ObjectParameter("Deletelog", "");//生成一个新的数据变量对象
System.Data.Objects.ObjectParameter DeleteRowsTotal = new System.Data.Objects.ObjectParameter("DeleteRowsTotal", 0);//生成一个新的数据变量对象
int retotle = currentContext.ExecuteFunction("DeleteCompanyExt", new ObjectParameter("CompanyId", ID), DeleteRowsTotal, Deletelog);
var relog=new List<string >();
relog.Add(Deletelog.Value.ToString());
relog.Add(DeleteRowsTotal.Value.ToString());
return relog;
}


浙公网安备 33010602011771号