57、代码中处理数据库的全面指南

代码中处理数据库的全面指南

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

代码解释

  1. 创建数据适配器
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 语句正确,否则可能会导致数据检索失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值