代码中处理数据库的全面指南
1. 使用 OracleConnection 类
可以使用
OleDbConnection
对象或
OracleConnection
对象连接到 Oracle 数据源。
OracleConnection
对象针对 Oracle 数据提供程序进行了优化。以下是创建
OracleConnection
对象并为其
ConnectionString
属性分配连接字符串的示例:
Dim ConnectionString As String = "Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;Persist Security Info=False;Initial " & _
"Catalog=pubs;Packet Size=4096;Workstation " & _
"ID=STEVE;Use Encryption for Data=False"
Dim Connection1 As OleDbConnection = New OleDbConnection(ConnectionString)
OracleConnection
类的层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.OracleClient.OracleConnection]
OracleConnection
类的重要公共属性、方法和事件与
OleDbConnection
类相同,只是
OracleConnection
类不支持
GetOleDbSchema
方法。
2. 使用命令对象
要使用连接对象,需要使用命令对象,因为命令对象包含用于从数据库中提取数据的实际 SQL。要从数据库中检索数据,可以按以下步骤操作:
1. 创建一个连接对象。
2. 使用其
Open
方法打开连接。
3. 将打开的连接对象分配给命令对象的
Connection
属性。
可以将命令对象分配给数据适配器的命令属性,例如
SelectCommand
属性(当调用数据适配器的
Fill
方法时,可从数据库中检索数据行)。除了
SelectCommand
属性,数据适配器还支持
UpdateCommand
、
InsertCommand
和
DeleteCommand
属性,每个属性都接受执行这些不同功能的连接对象。
将所需的 SQL 放入命令对象有两种方法:
- 将文本分配给命令对象的
CommandText
属性。
- 将其传递给命令对象的构造函数,例如选择
pubs
数据库中
authors
表的所有记录:
Dim Command1 As OleDbCommand = _
New OleDbCommand("SELECT * FROM authors")
设置命令的类型(对于 SQL 语句,类型为
CommandType.Text
,这也是默认值),并将打开的连接分配给命令的
Connection
属性,使该命令对象处于活动状态:
Dim Command1 As OleDbCommand = _
New OleDbCommand("SELECT * FROM authors")
Command1.CommandType = CommandType.Text
Connection1.Open()
Command1.Connection = Connection1
此时,该命令对象已准备好使用,例如可以将其分配给数据适配器的
SelectCommand
属性,以便在调用数据适配器的
Fill
方法时执行其 SQL。
还可以使用命令对象的内置方法在数据库中执行命令,无需数据适配器:
-
ExecuteNonQuery
:执行不返回数据行的 SQL 语句(如 SQL
INSERT
、
DELETE
、
UPDATE
和
SET
语句)。
-
ExecuteReader
:执行返回行的 SQL 命令,但请注意,此方法不返回数据集,而是创建一个功能较弱的数据读取器。
-
ExecuteScalar
:计算并返回数据库中的单个值,例如各种记录的总和。
3. 使用不同的命令类
3.1 OleDbCommand 类
OleDbCommand
类包含在 OLE DB 数据提供程序支持的数据库中执行的 SQL 语句或存储过程。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.OleDb.OleDbCommand]
OleDbCommand
对象的重要公共属性和方法如下表所示:
| 属性 | 含义 |
| — | — |
|
CommandText
| 返回或设置此命令要执行的 SQL 语句或存储过程。 |
|
CommandTimeout
| 返回执行命令时等待的时间(以秒为单位)。 |
|
CommandType
| 返回或设置
CommandText
属性的数据类型(对于 SQL,通常设置为
CommandType.Text
)。 |
|
Connection
| 返回或设置要使用的连接对象。 |
|
DesignTimeVisible
| 返回或设置命令对象在设计时是否可见。 |
|
Parameters
| 返回命令参数。 |
|
Transaction
| 返回或设置包含该命令的事务。 |
|
UpdatedRowSource
| 返回或设置使用
Update
方法时结果在数据行中的使用方式。 |
| 方法 | 含义 |
|---|---|
Cancel
| 取消命令。 |
CreateParameter
| 创建一个新参数。 |
ExecuteNonQuery
| 执行不返回行的 SQL 语句,返回受影响的行数。 |
ExecuteReader
| 使用该命令创建一个数据读取器。 |
ExecuteScalar
| 执行命令并返回结果中第一行第一列的值。 |
Prepare
| 创建命令的编译版本。 |
ResetCommandTimeout
| 将超时值重置为默认值。 |
3.2 SqlCommand 类
SqlCommand
对象与
OleDbCommand
对象非常相似,只是它们专为与 SQL 连接一起使用而设计。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.SqlClient.SqlCommand]
SqlCommand
对象的重要公共属性和方法与
OleDbCommand
对象相同。
3.3 OdbcCommand 类
OdbcCommand
对象与
OleDbCommand
对象类似,但用于 SQL 连接,而非 OLE DB 连接。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Odbc.OdbcConnection]
OdbcCommand
对象的重要公共属性、方法和事件与
OleDbCommand
对象相同。
3.4 OracleCommand 类
在编程方面,
OracleCommand
对象与其他命令对象类似,只是它们与
OracleConnection
对象一起使用。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.OracleClient.OracleCommand]
OracleCommand
类的重要属性、方法和事件与
OleDbCommand
对象相同,只是没有
CommandTimeout
属性,并且
OracleCommand
类支持以下附加方法:
| 方法 | 含义 |
| — | — |
|
ExecuteOracleNonQuery
| 执行 SQL 语句并返回受影响的行数。 |
|
ExecuteOracleScalar
| 执行查询并将查询返回结果中第一行的第一列作为特定于 Oracle 的数据类型返回。 |
4. 使用数据适配器
数据适配器就像数据集和数据源之间的桥梁。数据集实际上只是数据的缓存,它们不与数据库保持直接连接。
OleDbDataAdapter
对象通过支持
Fill
方法将数据从数据源加载到数据集中,以及支持
Update
方法将对数据集所做的更改发送回数据源,从而连接数据集和数据源。
创建数据连接并使用它创建命令对象后,可以将命令对象分配给数据适配器的命令属性之一,如
SelectCommand
、
InsertCommand
、
DeleteCommand
和
UpdateCommand
(使用数据适配器配置向导时,所有这些命令对象都会自动创建)。如果只计划从数据源检索数据,只需将命令对象分配给
SelectCommand
。
创建数据适配器对象时,还可以指定表映射。默认情况下,数据集中的表名与数据源中的表名相同,但可以根据在数据集中的命名方式使其不同。表映射将数据源中的表名与数据集中的表名关联起来。例如,将数据库中的
authors
表存储在数据集中名为
writers
的表中:
Dim Table1Mappings As New DataTableMappingCollection()
OleDbDataAdapter1.Table1Mappings.Add("authors", "writers")
4.1 DataAdapter 类
DataAdapter
类是数据适配器的基类,它表示数据集和数据提供程序中的数据库之间的桥梁。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
DataAdapter
类的重要公共属性和方法如下表所示:
| 属性 | 含义 |
|---|---|
AcceptChangesDuringFill
|
返回或设置将数据行添加到表后是否调用其
AcceptChanges
方法。
|
TableMappings
| 返回源表和数据表之间的映射。 |
| 方法 | 含义 |
|---|---|
Fill
| 添加或更新数据集中的行以匹配数据源中的行。默认情况下创建名为 “Table” 的表。 |
FillSchema
|
向指定的
DataSet
对象添加名为 “Table” 的表,使该表的架构与数据源中的架构匹配。
|
GetFillParameters
|
返回执行 SQL
SELECT
语句时要使用的参数。
|
Update
|
通过为给定数据集中的每个插入、更新或删除的行调用
INSERT
、
UPDATE
或
DELETE
语句来更新数据源。
|
4.2 DbDataAdapter 类
DbDataAdapter
类是
OleDbDataAdapter
和
SqlDataAdapter
类的基类。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
D --> E[System.Data.Common.DbDataAdapter]
DbDataAdapter
对象的重要公共方法和事件如下表所示:
| 方法 | 含义 |
|---|---|
Fill
| 添加或更新数据集中的行以匹配数据源中的行。 |
GetFillParameters
|
返回执行 SQL
SELECT
语句时要使用的参数。
|
Update
|
通过为数据集中的每个插入、更新或删除的行调用
INSERT
、
UPDATE
或
DELETE
语句来更新数据存储。
|
| 事件 | 含义 |
|---|---|
FillError
| 在执行填充操作时发生错误时触发。 |
4.3 OleDbDataAdapter 类
OleDbDataAdapter
类表示数据集和 OLE DB 数据库之间的桥梁。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
D --> E[System.Data.Common.DbDataAdapter]
E --> F[System.Data.OleDb.OleDbDataAdapter]
OleDbDataAdapter
对象的重要公共属性、方法和事件如下表所示:
| 属性 | 含义 |
|---|---|
DeleteCommand
| 返回或设置用于删除记录的 SQL。 |
InsertCommand
| 返回或设置用于插入新记录的 SQL。 |
SelectCommand
| 返回或设置用于选择记录的 SQL。 |
UpdateCommand
| 返回或设置用于更新记录的 SQL。 |
| 方法 | 含义 |
|---|---|
Fill
| 向数据集添加或刷新行,使其与数据存储中的行匹配。 |
| 事件 | 含义 |
|---|---|
RowUpdated
| 当一行更新时触发。 |
RowUpdating
| 当一行正在更新时触发。 |
4.4 SqlDataAdapter 类
SqlDataAdapter
类是专门为与 SQL Server 一起使用而设计的数据适配器。与
OleDbDataAdapter
类一样,
SqlDataAdapter
类包含用于加载和更新数据的
SelectCommand
、
InsertCommand
、
DeleteCommand
和
UpdateCommand
属性。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
D --> E[System.Data.Common.DbDataAdapter]
E --> F[System.Data.SqlClient.SqlDataAdapter]
SqlDataAdapter
类的重要属性、方法和事件与
OleDbDataAdapter
类相同。
4.5 OdbcDataAdapter 类
OdbcDataAdapter
类与 ODBC 连接和命令对象一起使用。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
D --> E[System.Data.Common.DbDataAdapter]
E --> F[System.Data.Odbc.OdbcDataAdapter]
OdbcDataAdapter
类的重要属性、方法和事件与
SqlDataAdapter
类相同。
4.6 OracleDataAdapter 类
OracleDataAdapter
类与 Oracle 数据提供程序一起使用。其层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Common.DataAdapter]
D --> E[System.Data.Common.DbDataAdapter]
E --> F[System.Data.OracleClient.OracleDataAdapter]
OracleDataAdapter
类的重要属性、方法和事件与
OdbcDataAdapter
类相同。
5. 使用 DataSet 类
数据集是用于在 ADO.NET 中存储数据库记录的缓存。
DataSet
类的层次结构如下:
graph LR
A[System.Object] --> B[System.ComponentModel.MarshalByValueComponent]
B --> C[System.Data.DataSet]
DataSet
对象的重要公共属性、方法和事件如下表所示:
| 属性 | 含义 |
|---|---|
DataSetName
| 返回或设置数据集的名称。 |
EnforceConstraints
| 返回或设置是否强制执行约束规则。 |
HasErrors
| 指示任何表中的任何行是否存在错误。 |
Relations
| 获取链接表的关系对象。 |
Tables
| 返回数据集中的表。 |
| 方法 | 含义 |
|---|---|
AcceptChanges
| 接受(提交)对数据集所做的更改。 |
Clear
| 通过删除所有表中的所有行来清除数据集。 |
Copy
| 复制数据集。 |
GetChanges
| 返回包含对当前数据集所做的所有更改的数据集。 |
GetXml
| 以 XML 格式返回数据集中的数据。 |
GetXmlSchema
| 返回数据集的 XSD 架构。 |
HasChanges
| 指示数据集是否有尚未接受的更改。 |
Merge
| 将此数据集与另一个数据集合并。 |
ReadXml
| 从 XML 读取数据到数据集中。 |
ReadXmlSchema
| 从 XML 读取架构到数据集中。 |
RejectChanges
|
回滚自创建数据集或上次调用
AcceptChanges
方法以来对数据集所做的更改。
|
Reset
| 将数据集重置为原始状态。 |
WriteXml
| 将数据集的架构和数据写入 XML。 |
WriteXmlSchema
| 将数据集架构写入 XML。 |
| 事件 | 含义 |
|---|---|
MergeFailed
| 合并操作失败时触发。 |
DataSet
对象可以包含多个数据库表,每个
DataSet
对象由
DataTable
对象的集合组成,可以使用
DataRelation
对象将它们相互连接。
可以使用绑定上下文在数据集中导航记录,特别是可以使用
BindingManagerBase
对象的
Position
和
Count
属性来获取或设置在数据集中的位置以及数据集中的记录总数。
如果将数据集绑定到应用程序中的控件,用户可以编辑这些控件中显示的数据。此时,数据集中的数据也会更改,但底层数据库中的数据不会更改。可以使用数据集的
GetChanges
方法确定哪些行已更改,使用数据适配器的
Update
方法将这些更改发送回正在使用的数据提供程序中的底层数据库。数据提供程序可能会自行进行一些额外的更改,例如更新包含计算值的字段,并返回一个新的数据集。如果是这样,可以使用数据集的
Merge
方法将这些新字段合并到数据集中,然后使用数据集的
AcceptChanges
方法接受更改,或使用
RejectChanges
方法取消更改。
此外,数据集可以是类型化的或非类型化的。如果是类型化的(通常是这种情况),Visual Basic 会非常仔细地跟踪每个字段的数据类型(如果尝试将错误类型的数据放入字段中,会提示错误)。类型化数据集将其类型信息保存在 XML 架构中,XML 是数据集用于传输数据的协议,这使得它们在 Internet 上易于使用。可以使用数据集的
WriteXmlSchema
方法写出数据集的 XML 架构,或使用
WriteXml
方法以 XML 格式写出数据集的架构和数据,还可以使用
ReadXml
方法将 XML 格式的数据读回到数据集中。
6. 在代码中创建数据集
以下是一个创建数据集的示例,该示例连接到
pubs
数据库的
authors
表,并将数据集绑定到数据网格:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim dataset1 As New DataSet()
dataset1 = New DataSet("dataset1")
Dim ConnectionString As String = "Provider=SQLOLEDB.1;Integrated " & _
"Security=SSPI;Persist Security Info=False;Initial " & _
"Catalog=pubs;Packet Size=4096;Workstation ID=STEVE;" & _
"Use Encryption for Data=False"
Dim Connection1 As OleDbConnection = New OleDbConnection(ConnectionString)
Dim Command1 As OleDbCommand = _
New OleDbCommand("SELECT * FROM authors")
Command1.CommandType = CommandType.Text
Connection1.Open()
Command1.Connection = Connection1
' 后续可创建数据适配器并使用该命令对象
End Sub
在这个示例中,当用户点击 “Load the Authors Table” 按钮时,会创建一个名为
dataset1
的新数据集对象,并将该名称传递给
DataSet
构造函数。然后创建连接对象和命令对象,设置命令的类型并打开连接,将连接对象分配给命令对象的
Connection
属性,之后就可以创建数据适配器并使用该命令对象了。
详细步骤分析
下面详细分析上述代码示例的执行步骤:
1.
创建数据集对象
:
Dim dataset1 As New DataSet()
dataset1 = New DataSet("dataset1")
这里首先创建了一个
DataSet
对象,然后将其重新初始化为一个具有名称 “dataset1” 的
DataSet
对象。这样做的好处是在后续处理数据时,方便识别和管理该数据集,例如在将数据集转换为 XML 时,Visual Basic 会使用 “dataset1” 作为 XML 文档元素的名称。
2.
创建连接字符串和连接对象
:
Dim ConnectionString As String = "Provider=SQLOLEDB.1;Integrated " & _
"Security=SSPI;Persist Security Info=False;Initial " & _
"Catalog=pubs;Packet Size=4096;Workstation ID=STEVE;" & _
"Use Encryption for Data=False"
Dim Connection1 As OleDbConnection = New OleDbConnection(ConnectionString)
定义了一个连接字符串,该字符串包含了连接到
pubs
数据库所需的各种信息,如数据提供程序、安全信息、数据库名称等。然后使用这个连接字符串创建了一个
OleDbConnection
对象
Connection1
。
3.
创建命令对象并设置属性
:
Dim Command1 As OleDbCommand = _
New OleDbCommand("SELECT * FROM authors")
Command1.CommandType = CommandType.Text
Connection1.Open()
Command1.Connection = Connection1
创建了一个
OleDbCommand
对象
Command1
,并将 SQL 查询语句 “SELECT * FROM authors” 传递给它,用于从
authors
表中检索所有记录。将命令类型设置为
CommandType.Text
,表示这是一个普通的 SQL 文本命令。打开连接对象
Connection1
,并将其分配给命令对象的
Connection
属性,这样命令对象就可以使用该连接与数据库进行交互。
后续操作示例
在完成上述步骤后,通常还需要创建数据适配器并使用该命令对象来填充数据集,以下是完整的示例代码:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' 创建数据集对象
Dim dataset1 As New DataSet()
dataset1 = New DataSet("dataset1")
' 创建连接字符串和连接对象
Dim ConnectionString As String = "Provider=SQLOLEDB.1;Integrated " & _
"Security=SSPI;Persist Security Info=False;Initial " & _
"Catalog=pubs;Packet Size=4096;Workstation ID=STEVE;" & _
"Use Encryption for Data=False"
Dim Connection1 As OleDbConnection = New OleDbConnection(ConnectionString)
' 创建命令对象并设置属性
Dim Command1 As OleDbCommand = _
New OleDbCommand("SELECT * FROM authors")
Command1.CommandType = CommandType.Text
Connection1.Open()
Command1.Connection = Connection1
' 创建数据适配器
Dim adapter As New OleDbDataAdapter(Command1)
' 使用数据适配器填充数据集
adapter.Fill(dataset1, "authors")
' 关闭连接
Connection1.Close()
' 将数据集绑定到数据网格(假设存在一个名为 DataGridView1 的数据网格控件)
DataGridView1.DataSource = dataset1.Tables("authors")
End Sub
代码解释
- 创建数据适配器 :
Dim adapter As New OleDbDataAdapter(Command1)
使用之前创建的命令对象
Command1
创建了一个
OleDbDataAdapter
对象
adapter
,该数据适配器将使用该命令对象从数据库中检索数据。
2.
填充数据集
:
adapter.Fill(dataset1, "authors")
调用数据适配器的
Fill
方法,将从数据库中检索到的数据填充到
dataset1
数据集中,并将其存储在名为 “authors” 的表中。
3.
关闭连接
:
Connection1.Close()
在完成数据检索后,关闭数据库连接,释放资源。
4.
绑定数据集到数据网格
:
DataGridView1.DataSource = dataset1.Tables("authors")
将数据集中的 “authors” 表绑定到一个名为
DataGridView1
的数据网格控件上,这样就可以在界面上显示从数据库中检索到的数据。
总结
通过以上步骤,我们可以在代码中完成连接数据库、创建命令对象、使用数据适配器填充数据集以及将数据集绑定到界面控件的操作。在实际应用中,还可以根据需要对数据集进行更多的操作,如更新数据、删除数据等,同时要注意处理可能出现的异常情况,确保程序的稳定性和可靠性。
操作流程图
graph TD
A[创建数据集对象] --> B[创建连接字符串和连接对象]
B --> C[创建命令对象并设置属性]
C --> D[创建数据适配器]
D --> E[使用数据适配器填充数据集]
E --> F[关闭连接]
F --> G[将数据集绑定到数据网格]
注意事项列表
- 在使用数据库连接时,要确保连接字符串的正确性,包括数据库名称、服务器地址、用户名和密码等信息。
- 在操作完成后,及时关闭数据库连接,避免资源浪费和潜在的安全风险。
- 在处理数据集时,要注意数据的类型和格式,避免出现数据转换错误。
- 在使用数据适配器填充数据集时,要确保命令对象的 SQL 语句正确,否则可能会导致数据检索失败。
超级会员免费看
2492

被折叠的 条评论
为什么被折叠?



