VB.NET学习笔记:ADO.NET操作ACCESS数据库——执行含参数SQL语句或存储过程

命令对象可使用参数来将值传递给 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方法如下:
OleDbParameterCollection对象的Add方法

(1)、第1、2个重载了的Add方法

必须先实例化OleDbParameter对象,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应用程序中创建查询对象(可含参数或不含参数)。如图:
创建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()

猜你喜欢

转载自blog.csdn.net/zyjq52uys/article/details/88576853