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

执行带参数的SQL语句跟执行存储过程是类似的,我们只需要将命令类型从CommandType.StoredProcedure改为CommandType.Text即可。另外注意一点,在我们的平台内部,除了Access数据库(即以OLEDB驱动处理的数据源)用“?”来表示参数外,其他数据源的参数都可以统一用“@参数名称”来表示参数。平台会替我们将“@”替换成相应数据库支持的参数名前缀的。

示例一:返回DataTableHelp

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

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

VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para = New With {.ID = "U000000003"}
'直接执行存储过程
Dim dt As DataTableHelp=db.ExecuteDataTableHelp("select * from UserInfo where ID=@ID",CommandType.Text,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" };
// 直接执行存储过程
DataTableHelp dt = db.ExecuteDataTableHelp("select * from UserInfo where ID=@ID", CommandType.Text, 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("select * from UserInfo where ID=@ID",CommandType.Text,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("select * from UserInfo where ID=@ID", CommandType.Text, 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("select * from UserInfo where ID=@ID",CommandType.Text,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("select * from UserInfo where ID=@ID", CommandType.Text, para2);
if (dt != null && dt.DataRows.Count > 0)
    MessageBox.Show(dt.DataRows.Count.ToString());

示例二、返回DataReader

 VB.Net
 '获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para = New With {.EndDate = DateTime.Now,.BeginDate=DateTime.Now.GetFirstDayOfYear()}
'直接执行存储过程
Dim reader As System.Data.Common.DbDataReader=db.ExecuteDataReader("select * from EmployeeInfo where EntryDate>=@BeginDate and EntryDate<@EndDate",CommandType.Text,para)
If reader IsNot Nothing AndAlso reader.HasRows Then
    MessageBox.Show("有数据")
End If

 C#
// 获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
 var para = new { EndDate = DateTime.Now, BeginDate = DateTime.Now.GetFirstDayOfYear() };
// 直接执行存储过程
System.Data.Common.DbDataReader reader = db.ExecuteDataReader("select * from EmployeeInfo where EntryDate>=@BeginDate and EntryDate<@EndDate", CommandType.Text, para);
if (reader != null && reader.HasRows)
    MessageBox.Show("有数据");

示例三、返回Object

 VB.Net
'获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para = New With {.ID = "U000000003"}
Dim strUserName As String=db.ExecuteScalar("select FullName from EmployeeInfo Where EmployeeID=@ID",CommandType.Text,para)
MessageBox.Show(strUserName)

 C#
// 获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
var para = new { ID = "U000000003" };
string strUserName = db.ExecuteScalar("select FullName from EmployeeInfo Where EmployeeID=@ID", CommandType.Text, para).CType<string>("");
MessageBox.Show(strUserName);

示例四、直接执行SQL语句,返回命令执行成功的条数。

 VB.Net
'获得指定数据源
Dim db As Database=Proj.SysDataFactory("UserDB")
'创建一个匿名对象,保存参数
Dim para = New With {.ID = "U000000003"}
Dim intRun As Integer=db.ExecuteNonQuery("update EmployeeInfo set FullName='NewName' Where EmployeeID=@ID",CommandType.Text,para)
If intRun>0 Then
    MessageBox.Show("执行命令成功!")
End If

 C#
// 获得指定数据源
Database db = Proj.SysDataFactory["UserDB"];
// 创建一个匿名对象,保存参数
var para = new { ID = "U000000003" };
int intRun = db.ExecuteNonQuery("update EmployeeInfo set FullName='NewName' Where EmployeeID=@ID", CommandType.Text, para);
if (intRun > 0)
    MessageBox.Show("执行命令成功!");