Previous topicNext topic
Help > 开发指南 > SanMuGrid平台编程 > 主要对象 > Database > ADO数据处理 >
执行存储过程

执行存储过程是一些大的项目中有很大概率会用到的功能,我们平台作为一个低代码开发平台当然会支持这样一种非常常见的功能。

因为存储过程分为两种情景,一种是有返回值的,另外一种是没有返回值的。我们就以两个简单的示例来演示一下调用这两种类型存储过程的方法。

没有返回值:

Create PROCEDURE UpdateEmployeeInfoStatus
AS
BEGIN
 Update EmployeeInfo set InPosition=1
END

有返回值:

Create PROCEDURE GetEmployeeInfoByID
 @ID nvarchar(36)
AS
BEGIN
 SELECT * from EmployeeInfo where
EmployeeID=@ID
END

调用无返回值的存储过程

示例一:无参数无返回值场景

 VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'直接执行存储过程

db.ExecuteNonQuery(
"UpdateEmployeeInfoStatus",CommandType.StoredProcedure)

 C#
  //获得指定数据源
Database db=Proj.SysDataFactory["UserDB"];
//直接执行存储过程

db.ExecuteNonQuery(
"UpdateEmployeeInfoStatus",CommandType.StoredProcedure);

示例二:有参数有返回值场景(直接返回表的场景)

我们在传递参数的时候,可以有多种传递方式,我们可以选择匿名类方式传递参数,也可以通过字典方式传递参数,同样可以通过参数类来传递。

方式1:匿名类传递参数,此方式传递参数会非常简单方便。注意赋值的数值类型得跟存储过程设定的参数类型一致。

VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para = New With {.ID = "U000000003",.Name="Jimmy"}
'直接执行存储过程
Dim dt As DataTableHelp=db.ExecuteDataTableHelp("GetEmployeeInfoByID",CommandType.StoredProcedure,para)
If dt IsNot Nothing AndAlso dt.DataRows.Count>0 Then
    MsgBox(dt.DataRows.Count)
End If

C#
//获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
var para = new { ID = "U000000003",Name="Jimmy" };
// 直接执行存储过程
DataTableHelp dt = db.ExecuteDataTableHelp("GetEmployeeInfoByID", CommandType.StoredProcedure, para);
if (dt != null && dt.DataRows.Count > 0)
    MessageBox.Show(dt.DataRows.Count.ToString());

方式2:字典传递参数,此方式传递参数,生成参数也相对方便。注意在给字典赋值的时候,一定要按存储过程参数类型传递进去。

VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para1 As New Dictionary(Of String,Object)
para1("ID")="U000000003"
'直接执行存储过程
Dim dt As DataTableHelp=db.ExecuteDataTableHelp("GetEmployeeInfoByID",CommandType.StoredProcedure,para1)
If dt IsNot Nothing AndAlso dt.DataRows.Count>0 Then
    MsgBox(dt.DataRows.Count)
End If

C#
//获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
Dictionary<string, object> para1 = new Dictionary<string, object>();
para1["ID"] = "U000000003";

// 直接执行存储过程
DataTableHelp dt = db.ExecuteDataTableHelp("GetEmployeeInfoByID", CommandType.StoredProcedure, para1);
if (dt != null && dt.DataRows.Count > 0)
    MessageBox.Show(dt.DataRows.Count.ToString());
    

方式3:参数集合传递参数,此方式传递参数写代码相对麻烦一点,但是可以控制参数的传递方向。而且可以让多种数据库的处理方式一致。

VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para2 As New List(Of System.Data.Common.DbParameter)
Dim p1 As System.Data.Common.DbParameter=db.GetInstanceParameter() '设置参数的名称
p1.ParameterName="ID"
'设置参数的字段类型
p1.DbType=DbType.String
'设置参数的传递方向,可以传入,也可以传出,有需要将参数传出的话,就需要用到此属性
p1.Direction= ParameterDirection.Input
'参数传入的值
p1.Value="U000000003"
'将参数加入集合中 
para2.Add(p1)

'直接执行存储过程
Dim dt As DataTableHelp=db.ExecuteDataTableHelp("GetEmployeeInfoByID",CommandType.StoredProcedure,para2)
If dt IsNot Nothing AndAlso dt.DataRows.Count>0 Then
    MsgBox(dt.DataRows.Count)
End If 

C#
//获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
List<System.Data.Common.DbParameter> para2 = new List<System.Data.Common.DbParameter>(); 
System.Data.Common.DbParameter p1 = db.GetInstanceParameter();
// 设置参数的名称
p1.ParameterName = "ID";
// 设置参数的字段类型
p1.DbType = DbType.String;
// 设置参数的传递方向,可以传入,也可以传出,有需要将参数传出的话,就需要用到此属性
p1.Direction = ParameterDirection.Input;
// 参数传入的值
p1.Value = "U000000003";
// 将参数加入集合中
para2.Add(p1);

// 直接执行存储过程
DataTableHelp dt = db.ExecuteDataTableHelp("GetEmployeeInfoByID", CommandType.StoredProcedure, para2);
if (dt != null && dt.DataRows.Count > 0)
    MessageBox.Show(dt.DataRows.Count.ToString());

如果没有返回值,不管有没有参数需要传递,我们都可以用db.ExecuteNonQuery这个方法。如果有表数据返回,则可以用db.ExecuteDataTableHelp方法来执行并返回相应的表数据。如果是通过存储过程的参数返回值,则可以考虑直接用db.ExecuteNonQuery这个方法。