执行带参数的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 |
|
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("执行命令成功!"); |