一、概述
基于XML和离线计算模型。
的两个核心组件:.Net数据提供程序、DataSet。
.net数据提供程序用来与数据库的连接,如数据提供程序——System.Data.SqlClient, 访问SQl2000或以上版本;数据提供程序——System.Data.OleDb,主要访问Access。
DataSet用来与XML数据连接。设计的目的是独立于任何数据源的数据访问,可有多种不同数据,也可用于XML数据。可与数据库离线,只在返回数据库时,才保持连接。
二、核心对象
1、Connection对象负责连接数据库,在System.Data.OleDb空间里对应的是OleDbConnection对象。
2、Command对象负责生成执行SQl语句,在System.Data.OleDb空间里对应的是OleDbCommand对象。
3、DataReader对象负责读取数据库的数据,在System.Data.OleDb空间里对应的是OleDbDataReader对象。
4、DataAdapter对象负责在Command对象执行完SQL语句后生成并填充DataSet和DataTable,在System.Data.OleDb空间里对应的是OleDbDataAdapter对象。
5、DataSet对象负责存取和更新数据。
三、操作ACCESS数据库的一般步骤
1、连接数据库——实例化OleDbConnection对象
OleDbConnection对象构造函数有2个,使用无参构造函数实例化后要设置其ConnectionString属性,而有参构造函数直接把ConnectionString属性值作为参数提供给了构造函数。
无参构造函数实例化代码:
Dim conn As New OleDbConnection()conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#"
有参构造函数实例化代码:
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")
可以阅读《操作ACCESS数据库——数据库连接字符串》一文了解如何正确书写和获取连接字符串。
2、打开连接
实例化OleDbConnection对象后可以使用其Open方法打开连接。
conn.Open()
3、下达命令(生成SQL语句)——实例化OleDbCommand对象
OleDbCommand对象有4个构造函数:
实例化OleDbCommand对象时需要设置如下属性:
(1)、CommandText:数据类型为String,要执行的 SQL 语句或存储过程。 默认值为一个空字符串。
(2)、CommandTimeout:数据类型为Int32,等待命令执行所需的时间(以秒为单位)。 默认值为 30 秒。
(3)、CommandType:获取或设置一个值,该值指示如何解释 CommandText 属性。数据类型为CommandType,CommandType 值之一。 默认值为 Text。
CommandType 值有3个,如下所示:
值 数值 描述
StoredProcedure 4 存储过程的名称。
TableDirect 512 表的名称。
Text 1 SQL 文本命令。 (默认。)
(4)、Connection:OleDbConnection实例。 默认值为 null。
(5)、Transaction:如果要执行事务需设置该属性。OleDbTransaction实例。 默认值为 null。
使用无参构造函数实例化代码:
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")Dim cmd As New OleDbCommand()mandText = "SELECT position.* FROM [position];"mandTimeout = 30 '默认值为30,所以此句可以省略mandType = CommandType.Text '这是默认值,所以此句可以省略cmd.Connection = conn
可以把属性CommandText或Connection的值作为参数传递给构造函数:
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")Dim cmd As New OleDbCommand("SELECT position.* FROM [position];")cmd.Connection = conn
或:
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")Dim cmd As New OleDbCommand("SELECT position.* FROM [position];", conn)
4、执行命令
(1)、OleDbCommand对象的ExecuteNonQuery方法
ExecuteNonQuery方法执行 SQL 语句后将返回受影响的行数,而不返回数据集。主要用于执行插入、更新和删除等不需要返回数据集的SQL语句。
测试代码:
'连接数据库Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")'打开数据库conn.Open()'生成命令Dim cmd As New OleDbCommand("SELECT position.* FROM [position];", conn)'执行命令cmd.ExecuteNonQuery()'关闭数据库conn.Close()
结果报错,如图所示:
把SQL语句修改为SELECT [position].* FROM [position]后正常执行命令,估计表名position为系统关键字,所以需要用[]括起。
(2)、OleDbCommand对象的ExecuteReader方法
返回一个OleDbDataReader对象,该对象是一个仅向前的只读数据流,所以主要用来执行基本SQL查询,要求SQL语句返回记录集。
测试代码:
'连接数据库Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")'打开数据库conn.Open()'生成命令Dim cmd As New OleDbCommand("SELECT [position].* FROM [position];", conn)'执行命令Dim dr As OleDbDataReader '不能new.应用程序不直接创建 IDataReader 接口的实例,而是创建继承 IDataReader 的类的实例dr = cmd.ExecuteReader()Dim dt As New DataTabledt.Load(dr)DataGridView1.DataSource = dt'关闭数据库conn.Close()
(3)、OleDbCommand对象的ExecuteScalar方法
执行查询后,返回由查询返回的结果集中的第一行的第一列。 其他列或行将被忽略。也就是说只返回一个值。
测试代码:
'连接数据库Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")'打开数据库conn.Open()'生成命令Dim cmd As New OleDbCommand("SELECT [position].* FROM [position];", conn)'执行命令MessageBox.Show(cmd.ExecuteScalar.ToString)'关闭数据库conn.Close()
(4)、OleDbDataAdapter数据适配器
OleDbDataAdapter就是一个搬运工:从数据源搬运到本地内存中以便来填充DataSet;或者从本地内中数据搬运回到数据源中。
OleDbDataAdapter对象的构造函数有4个:
构造函数里的参数变化万千,仔细观察却不离其中——实例化OleDbDataAdapter对象(无参数构造函数除外)时必须指定其SelectCommand属性(即一个OleDbCommand对象)。
如:
'连接数据库Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")'打开数据库conn.Open()'生成命令Dim cmd As New OleDbCommand("SELECT [position].* FROM [position];", conn)'执行命令Dim adapter As New OleDbDataAdapter()adapter.SelectCommand = cmd'填充DataTableDim dt As New DataTableadapter.Fill(dt)DataGridView1.DataSource = dt'关闭数据库conn.Close()
上述代码使用OleDbCommand对象的Fill方法来填充DataTable,该方法会自动打开连接,填充完毕后关闭连接,所以不需要conn.Open()和conn.Close()语句,当然如果连接原来是打开的,执行Fill方法后会继续保持打开状态。
也可以把SelectCommand属性作为参数传入构造函数来实例化OleDbDataAdapter对象,即:
Dim cmd As New OleDbCommand("SELECT [position].* FROM [position];", conn)Dim adapter As New OleDbDataAdapter(cmd)
也可不实例化OleDbCommand对象,直接使用传入构造函数的参数在构造函数内部(我自己的理解,不知道对不对)为SelectCommand属性赋值。如:
Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")Dim adapter As New OleDbDataAdapter("SELECT [position].* FROM [position];", conn)Dim dt As New DataTableadapter.Fill(dt)DataGridView1.DataSource = dt
甚至不实例化OleDbConnection对象也是可以的,代码越来越简练,如下:
Dim adapter As New OleDbDataAdapter("SELECT [position].* FROM [position];","Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\position.accdb;Jet OLEDB:Database Password=#")'填充DataTableDim dt As New DataTableadapter.Fill(dt)DataGridView1.DataSource = dt
5、关闭连接
执行命令完毕后,记得使用OleDbConnection对象的Close方法关闭数据库连接。
conn.Close()