命令对象可使用参数来将值传递给 SQL 语句或存储过程。 与命令文本不同,参数输入被视为文本值,而不是可执行代码。 这样可帮助抵御“SQL 注入”攻击,防止攻击者将命令插入 SQL 语句而危及数据库的安全。
一、执行含参数SQL语句
示例代码如下:
'连接数据库
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.mdb;Jet OLEDB:Database Password=#")
'打开数据库
conn.Open()
'生成命令
Dim cmd As New OleDbCommand()
cmd.CommandType = CommandType.Text
cmd.Connection = conn
cmd.CommandText = "SELECT Customers.CompanyName, Customers.ContactName, Customers.City FROM Customers WHERE (((Customers.ContactTitle)=?) AND ((Customers.City)=?));"
cmd.Parameters.Add("@cityer", OleDbType.VarChar).Value = "物主"
cmd.Parameters.Add("@cityerr", OleDbType.VarChar).Value = "天津"
'执行命令
Dim adapter As New OleDbDataAdapter()
adapter.SelectCommand = cmd
'填充DataTable
Dim dt As New DataTable
adapter.Fill(dt)
DataGridView1.DataSource = dt
'关闭数据库
conn.Close()
代码关键解释:
1、占位符(?)
需要执行的SQL语句:
SELECT Customers.CompanyName, Customers.ContactName, Customers.City FROM Customers WHERE (((Customers.ContactTitle)='物主') AND ((Customers.City)='天津'));
在书写SQL语句时用(而且是必须用)占位符?代替了具体的值。如:
SELECT Customers.CompanyName, Customers.ContactName, Customers.City FROM Customers WHERE (((Customers.ContactTitle)=?) AND ((Customers.City)=?));
其实参数占位符的语法取决于数据源。 .NET Framework 数据提供程序处理命名和指定参数和参数占位符的方式各不相同。对于SQLServer.net数据提供程序是以 “@参数名”格式使用命名参数。而OLEDB.NET 访问接口不支持命名的参数,必须使用问号 (?) 占位符。
2、为命令提供参数
使用Add方法为OleDbCommand对象的Parameters属性添加OleDbParameter对象。
其实是通过OleDbCommand对象的Parameters属性获取 OleDbParameterCollection对象,而OleDbParameterCollection对象表示SQL 语句或存储过程的参数(即OleDbParameter对象)的集合。
常用的Add方法如下:
(1)、第1、2个重载了的Add方法
必须先实例化OleDbParameter对象,OleDbParameter对象常用的构造函数如下:
通过OleDbParameter对象构造函数初始化OleDbParameter对象必要的属性,如至少需要设置OleDbParameter对象的名称ParameterName属性、值Value属性2个属性。
无参数构造函数示例代码:
Dim parameter As New OleDbParameter()
parameter.ParameterName = "@cityer" '一个你喜欢的名称,当然最好是字段名
parameter.OleDbType = OleDbType.VarChar '参数的数据类型,默认值为 VarWChar
parameter.Size = 5 '列中的数据的最大大小(以字节为单位)。 默认值将根据参数值进行推断。
parameter.Direction = ParameterDirection.Input 'ACCESS中只能输入参数,而默认值为 Input,所以此属性不必设置
parameter.Value = "物主" '获取或设置参数的值,默认值为 null。
当然也可以将以上参数传入构造函数里,如:
Dim parameter As New OleDbParameter("@cityer", dataType:=OleDbType.VarChar)
parameter.Size = 5
parameter.Value = "物主"
或:
Dim parameter As New OleDbParameter("@cityer", "物主")
parameter.Size = 5
parameter.OleDbType = OleDbType.VarChar
或:
Dim parameter As New OleDbParameter("@cityer", OleDbType.VarChar, 5)
parameter.Value = "物主"
以上不同的构造函数得到的效果是一样的。
实例化OleDbParameter对象后,就可以用Add方法为OleDbCommand对象的Parameters属性添加参数了。
cmd.Parameters.Add(parameter)
集合中的参数数量必须等于的命令文本中的参数占位符的个数,否则适用于 OLE DB.NET Framework 数据提供程序可能会引发错误。本示例代码的SQL语句中还有一个参数占位符,所以还需按以上方法再添加一个参数:
Dim parameter1 As New OleDbParameter()
parameter1.ParameterName = "@cityerr"
parameter1.OleDbType = OleDbType.VarChar
parameter1.Size = 10
parameter1.Direction = ParameterDirection.Input
parameter1.Value = "天津"
cmd.Parameters.Add(parameter1)
这里要特别注意这两句代码的先后顺序一定不能颠倒:
cmd.Parameters.Add(parameter)
cmd.Parameters.Add(parameter1)
OLEDB.NET 访问接口不支持命名的参数,因此,在把OleDbParameter对象添加到OleDbParameterCollection中的顺序必须直接对应于参数占位符(?)所在的命令文本中的位置。如果颠倒了顺序则得到的SQL语句则变为:
SELECT Customers.CompanyName, Customers.ContactName, Customers.City FROM Customers WHERE (((Customers.ContactTitle)='天津') AND ((Customers.City)='物主'));
(2)、其他Add方法
向Add方法中传入的参数不是一个OleDbParameter对象,而是OleDbParameter所必须的属性值,在Add方法内部构建OleDbParameter对象,因此省去了实例化OleDbParameter对象的步骤。
如:
cmd.Parameters.Add("@cityer", OleDbType.VarChar).Value = "物主"
cmd.Parameters.Add("@cityerr", OleDbType.VarChar).Value = "天津"
或:
cmd.Parameters.Add("@cityer", OleDbType.VarChar, 5).Value = "物主"
cmd.Parameters.Add("@cityerr", OleDbType.VarChar, 10).Value = "天津"
特别注意添加的顺序不能颠倒。
下面这个方法已过时,不宜采用:
cmd.Parameters.Add("@cityer", "物主")
二、执行ACCESS“存储过程”
ACCESS中的“存储过程”无法与SQL Server相比。ACCESS不支持多条SQL语句、不支持逻辑语句、不支持输出参数等等,说白了,所谓的ACCESS“存储过程”就是一个“查询”对象。
首先,需要在ACCESS应用程序中创建查询对象(可含参数或不含参数)。如图:
执行无参数“存储过程”的代码:
'连接数据库
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.mdb;Jet OLEDB:Database Password=#")
'打开数据库
conn.Open()
'生成命令
Dim cmd As New OleDbCommand()
cmd.CommandType = CommandType.StoredProcedure '设置使用存储过程
cmd.Connection = conn
cmd.CommandText = "StoredProcedureNoParameters" '存储过(查询对象)的名称
'执行命令
Dim adapter As New OleDbDataAdapter()
adapter.SelectCommand = cmd
'填充DataTable
Dim dt As New DataTable
adapter.Fill(dt)
DataGridView1.DataSource = dt
'关闭数据库
conn.Close()
执行有参数“存储过程”的代码:
'连接数据库
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.mdb;Jet OLEDB:Database Password=#")
'打开数据库
conn.Open()
'生成命令
Dim cmd As New OleDbCommand()
cmd.CommandType = CommandType.StoredProcedure '设置使用存储过程
cmd.Connection = conn
cmd.CommandText = "StoredProcedureWithParameters" '存储过(查询对象)的名称
cmd.Parameters.Add("@cityer", OleDbType.VarChar, 5).Value = "物主"
cmd.Parameters.Add("@cityerr", OleDbType.VarChar, 10).Value = "天津"
'执行命令
Dim adapter As New OleDbDataAdapter()
adapter.SelectCommand = cmd
'填充DataTable
Dim dt As New DataTable
adapter.Fill(dt)
DataGridView1.DataSource = dt
'关闭数据库
conn.Close()