使用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;
}

posted @ 2013-01-06 17:27  梅花香自苦寒来_rainy  阅读(925)  评论(0)    收藏  举报