在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一个新对象才能在存储过程方法中使用正确的参数。