59、在代码中处理数据库:全面指南

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

1. 数据行字段数据的访问

在代码里处理数据库时,你可以通过数字索引或者字段名来访问数据行字段中的数据。同时,还能省略 Item 关键字来简化表达式。例如,若有一个名为 Row1 的数据行,且 au_fname 字段是该行的第三个字段,下面这些语句是等效的:

Dim strFirstName As String = Row1.Item("au_fname")
Dim strFirstName As String = Row1("au_fname")
Dim strFirstName As String = Row1.Item(2)
Dim strFirstName As String = Row1(2)
2. ADO.NET 数据读取器概述

ADO.NET 支持数据读取器,它能让你快速、底层地访问数据,并且只能在数据库中向前逐行读取记录。常见的数据读取器类有 OleDbDataReader SqlDataReader OdbcDataReader OracleDataReader

3. 不同数据读取器类的使用
  • OleDbDataReader 类 :用于 OLE DB 数据提供程序。其类层次结构如下:
  • System.Object
  • System.MarshalByRefObject
  • System.Data.OleDb.OleDbDataReader
    该类的重要公共属性和方法如下表所示:
    | 属性/方法 | 含义 |
    | — | — |
    | 属性 | |
    | Depth | 返回当前行的嵌套深度 |
    | FieldCount | 返回当前行的列数 |
    | IsClosed | 指示数据读取器是否关闭 |
    | Item | 返回字段中的值 |
    | RecordsAffected | 返回 SQL 语句更改、插入或删除的行数 |
    | 方法 | |
    | Close | 关闭数据读取器 |
    | GetBoolean | 将字段值作为布尔值返回 |
    | GetByte | 将字段值作为字节返回 |
    | GetBytes | 读取字节流 |
    | GetChar | 将字段值作为字符返回 |
    | GetChars | 读取字符流 |
    | GetDataTypeName | 返回源数据类型的名称 |
    | GetDateTime | 将字段值作为 DateTime 对象返回 |
    | GetDecimal | 将字段值作为 Decimal 对象返回 |
    | GetDouble | 将字段值作为双精度浮点数返回 |
    | GetFieldType | 返回对象的数据类型 |
    | GetFloat | 将字段值作为单精度浮点数返回 |
    | GetGuid | 将字段值作为全局唯一标识符 (GUID) 返回 |
    | GetInt16 | 将字段值作为 16 位有符号整数返回 |
    | GetInt32 | 将字段值作为 32 位有符号整数返回 |
    | GetInt64 | 将字段值作为 64 位有符号整数返回 |
    | GetName | 返回指定列的名称 |
    | GetOrdinal | 根据列名返回列序号 |
    | GetSchemaTable | 返回架构 |
    | GetString | 将字段值作为字符串返回 |
    | GetValue | 以原始格式返回列的值 |
    | GetValues | 返回当前行的所有属性列 |
    | IsDBNull | 指示列是否包含不存在(或缺失)的值 |
    | Read | 将数据读取器推进到下一条记录并读取该记录 |

  • SqlDataReader 类 :用于 SQL Server。其类层次结构如下:

  • System.Object
  • System.MarshalByRefObject
  • System.Data.SqlClient.SqlDataReader
    该类除了具有与 OleDbDataReader 类相同的重要公共属性和方法外,还有一些额外的重要方法,如下表所示:
    | 方法 | 含义 |
    | — | — |
    | GetSqlBinary | 将字段值作为 SqlBinary 返回 |
    | GetSqlByte | 将字段值作为 SqlByte 返回 |
    | GetSqlDateTime | 将字段值作为 SqlDateTime 返回 |
    | GetSqlDecimal | 将字段值作为 SqlDecimal 返回 |
    | GetSqlDouble | 将字段值作为 SqlDouble 返回 |
    | GetSqlGuid | 将字段值作为 SqlGuid 返回 |
    | GetSqlInt16 | 将字段值作为 SqlInt16 返回 |
    | GetSqlInt32 | 将字段值作为 SqlInt32 返回 |
    | GetSqlInt64 | 将字段值作为 SqlInt64 返回 |
    | GetSqlMoney | 将字段值作为 SqlMoney 返回 |
    | GetSqlSingle | 将字段值作为 SqlSingle 返回 |
    | GetSqlString | 将字段值作为 SqlString 返回 |
    | GetSqlValue | 返回 SqlDbType Variant 类型的对象 |
    | GetSqlValues | 返回当前行的所有属性列 |

  • OdbcDataReader 类 :用于 ODBC 数据提供程序。其类层次结构如下:

  • System.Object
  • System.MarshalByRefObject
  • System.Data.Odbc.OdbcDataReader
    该类具有与 OleDbDataReader 类相同的重要公共属性和方法。

  • OracleDataReader 类 :用于 Oracle 数据提供程序。其类层次结构如下:

  • System.Object
  • System.MarshalByRefObject
  • System.Data.OracleClient.OracleDataReader
    该类除了具有与 OleDbDataReader 类相同的重要公共属性和方法外,还有一些额外的重要方法,如下表所示:
    | 方法 | 含义 |
    | — | — |
    | GetOracleBFile | 将给定列的值作为 OracleBFile 对象返回 |
    | GetOracleBinary | 将给定列的值作为 OracleBinary 对象返回 |
    | GetOracleDateTime | 将给定列的值作为 OracleDateTime 对象返回 |
    | GetOracleLob | 将给定列的值作为 OracleLob 对象返回 |
    | GetOracleMonthSpan | 将给定列的值作为 OracleMonthSpan 对象返回 |
    | GetOracleNumber | 将给定列的值作为 OracleNumber 对象返回 |
    | GetOracleString | 将给定列的值作为 OracleString 对象返回 |
    | GetOracleTimeSpan | 将给定列的值作为 OracleTimeSpan 对象返回 |
    | GetOracleValue | 以 Oracle 格式返回给定位置列的值 |
    | GetOracleValues | 以 Oracle 格式返回当前行的所有属性列 |
4. 在代码中创建数据读取器

在 Visual Basic 工具箱里没有数据读取器控件,你只能在代码中创建数据读取器。可以使用命令对象的 ExecuteReader 方法来创建数据读取器。以下是 CreateDataReader 示例在用户点击“获取数据”按钮时为 authors 表创建 OLE DB 数据读取器的代码:

Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim Connection1String As New String( _
        "Provider=SQLOLEDB;Data Source=;User ID=sa;Initial Catalog=pubs;")
    Dim Connection1 As New OleDbConnection(Connection1String)
    Dim Command1 As New OleDbCommand("SELECT * FROM authors", Connection1)
    Connection1.Open()
    Dim Reader1 As OleDbDataReader = _
        Command1.ExecuteReader(CommandBehavior.CloseConnection)
    '...
End Sub
5. 确定表的列名并读取数据

要确定 authors 表的列名,可以使用数据读取器的 GetSchemaTable 方法,示例代码如下:

Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim Connection1String As New String( _
        "Provider=SQLOLEDB;Data Source=;User ID=sa;Initial Catalog=pubs;")
    Dim Connection1 As New OleDbConnection(Connection1String)
    Dim Command1 As New OleDbCommand("SELECT * from AUTHORS", Connection1)
    Connection1.Open()
    Dim Reader1 As OleDbDataReader = _
        Command1.ExecuteReader(CommandBehavior.CloseConnection)
    Dim schemaTable As DataTable = Reader1.GetSchemaTable()
    TextBox1.Text &= schemaTable.Rows(0).Item(0).ToString() & ControlChars.CrLf
    TextBox2.Text &= schemaTable.Rows(1).Item(0).ToString() & ControlChars.CrLf
    TextBox3.Text &= schemaTable.Rows(2).Item(0).ToString() & ControlChars.CrLf
    TextBox4.Text &= schemaTable.Rows(3).Item(0).ToString() & ControlChars.CrLf
    TextBox1.Text &= "--------------" & ControlChars.CrLf
    TextBox2.Text &= "--------------" & ControlChars.CrLf
    TextBox3.Text &= "--------------" & ControlChars.CrLf
    TextBox4.Text &= "--------------" & ControlChars.CrLf
    '...
End Sub

若要从各个记录中恢复实际数据,数据读取器会逐个返回记录的字段,你可以使用 GetBoolean GetString GetDouble 等方法从数据读取器中读取实际数据。若事先不知道表中字段的数据类型,可以使用表的 XML 架构来确定这些数据类型,从而知道该使用哪种数据读取方法。以下是检查字符串和布尔值的代码示例:

Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim Connection1String As New String( _
        "Provider=SQLOLEDB;Data Source=;User ID=sa;Initial Catalog=pubs;")
    Dim Connection1 As New OleDbConnection(Connection1String)
    Dim Command1 As New OleDbCommand("select * from authors", Connection1)
    Connection1.Open()
    Dim Reader1 As OleDbDataReader = _
        Command1.ExecuteReader(CommandBehavior.CloseConnection)
    Dim schemaTable As DataTable = Reader1.GetSchemaTable()
    TextBox1.Text &= schemaTable.Rows(0).Item(0).ToString() & ControlChars.CrLf
    TextBox2.Text &= schemaTable.Rows(1).Item(0).ToString() & ControlChars.CrLf
    TextBox3.Text &= schemaTable.Rows(2).Item(0).ToString() & ControlChars.CrLf
    TextBox4.Text &= schemaTable.Rows(3).Item(0).ToString() & ControlChars.CrLf
    TextBox1.Text &= "--------------" & ControlChars.CrLf
    TextBox2.Text &= "--------------" & ControlChars.CrLf
    TextBox3.Text &= "--------------" & ControlChars.CrLf
    TextBox4.Text &= "--------------" & ControlChars.CrLf
    While Reader1.Read()
        If schemaTable.Rows(0).Item(5).ToString() = "System.String" Then
            TextBox1.Text &= Reader1.GetString(0) & ControlChars.Tab
        End If
        If schemaTable.Rows(0).Item(5).ToString() = "System.Boolean" Then
            TextBox1.Text &= Reader1.GetBoolean(0).ToString() & ControlChars.Tab
        End If
        If schemaTable.Rows(1).Item(5).ToString() = "System.String" Then
            TextBox2.Text &= Reader1.GetString(1) & ControlChars.Tab
        End If
        If schemaTable.Rows(1).Item(5).ToString() = "System.Boolean" Then
            TextBox2.Text &= Reader1.GetBoolean(1).ToString() & ControlChars.Tab
        End If
        If schemaTable.Rows(2).Item(5).ToString() = "System.String" Then
            TextBox3.Text &= Reader1.GetString(2) & ControlChars.Tab
        End If
        If schemaTable.Rows(2).Item(5).ToString() = "System.Boolean" Then
            TextBox3.Text &= Reader1.GetBoolean(2).ToString() & ControlChars.Tab
        End If
        If schemaTable.Rows(3).Item(5).ToString() = "System.String" Then
            TextBox4.Text &= Reader1.GetString(3) & ControlChars.Tab
        End If
        If schemaTable.Rows(3).Item(5).ToString() = "System.Boolean" Then
            TextBox4.Text &= Reader1.GetBoolean(3).ToString() & ControlChars.Tab
        End If
        TextBox1.Text &= ControlChars.CrLf
        TextBox2.Text &= ControlChars.CrLf
        TextBox3.Text &= ControlChars.CrLf
        TextBox4.Text &= ControlChars.CrLf
    End While
    Reader1.Close()
    Connection1.Close()
End Sub
6. 数据库操作的整体流程

在代码中处理数据库时,通常需要完成以下几个关键步骤:
1. 创建连接对象 :使用特定于数据提供程序的连接字符串创建连接对象,如 OleDbConnection SqlConnection OdbcConnection OracleConnection
2. 打开连接 :调用连接对象的 Open 方法打开连接。
3. 创建命令对象 :创建命令对象,如 OleDbCommand SqlCommand OdbcCommand OracleCommand ,并将 SQL 语句存储在其中。可以通过构造函数或 CommandText 属性设置 SQL 语句,同时将 CommandType 属性设置为 CommandType.Text
4. 关联连接和命令对象 :将连接对象分配给命令对象的 Connection 属性。
5. 使用数据适配器 :将命令对象分配给数据适配器对象的 SelectCommand DeleteCommand UpdateCommand InsertCommand 属性,使用数据适配器的 Fill 方法将数据填充到数据集对象中。
6. 创建数据表和记录 :可以创建 DataTable 对象来创建数据集中的数据表,使用 DataColumn 对象配置记录中的字段,使用 DataRow 对象创建新记录,并将其添加到数据表中。
7. 创建数据关系 :使用 DataRelation 对象创建数据关系,并将其添加到数据集的 Relations 集合中。
8. 使用数据读取器 :使用命令对象的 ExecuteReader 方法创建数据读取器,逐行读取数据。

7. 常见问题解答
  • 问题 :由于需要多次连接数据源且经常引用原始数据,操作速度较慢,有没有办法提高性能?
    解答 :如果应用程序使用多个连接,可以使用连接池来提高性能。使用 OLE DB 或 SQL Server 数据提供程序时,连接池通常会自动启用。对于 SQL Server,要确保连接字符串中的 Pooling 属性设置为 true
  • 问题 :已知如何遍历单个表中的所有行来显示该表的数据,如何显示数据集中所有表的所有数据?
    解答 :可以使用数据集的 Tables 属性访问所有表,示例代码如下:
For Each TableObject In DataSet11.Tables
    For Each RowObject In TableObject.Rows
        For Each ColumnObject In TableObject.Columns
            TextBox1.Text &= RowObject(ColumnObject) & ControlChars.Tab
        Next ColumnObject
        TextBox1.Text &= ControlChars.CrLf
    Next RowObject
Next TableObject

需要注意的是,表的最大行数为 16,777,216。

8. 工作坊
8.1 测验
  1. 如何使用连接对象指定要连接的数据源?
    • 解答:使用特定于数据提供程序的连接字符串。
  2. 如何将 SQL 语句分配给命令对象?
    • 解答:可以将 SQL 传递给命令对象的构造函数或 CommandText 属性,同时将 CommandType 属性设置为 CommandType.Text
  3. 如何将连接对象与命令对象关联?
    • 解答:将连接对象分配给命令对象的 Connection 属性,并调用连接对象的 Open 方法。
  4. 数据适配器对象支持哪四个可以分配命令对象的属性?
    • 解答: SelectCommand InsertCommand DeleteCommand UpdateCommand 属性。如果只是从数据源获取数据,只需使用 SelectCommand 属性。
  5. 如何将 DataRow 对象添加到 DataTable 对象中?
    • 解答:使用 DataTable 对象的 Rows 集合的 Add 方法。
8.2 练习
  1. 创建一个新的 Windows 应用程序,当用户点击按钮时连接到 pubs 数据库中的 publishers 表,并使用数据网格显示该表的数据。如果无法访问 pubs 数据库,可以使用其他数据库表进行相同的练习。
  2. 创建一个新的 Windows 应用程序,允许用户在文本框中输入电话簿应用程序的数据。将数据存储在数据集中(即创建自己的 DataTable 对象并将其添加到 DataSet 对象的 Tables 集合中),并让用户使用导航按钮浏览这些记录。(额外加分:使用 DataSet WriteXml 方法将用户数据保存到磁盘,然后使用 ReadXml 方法读取数据。)

通过以上内容,你可以全面了解在代码中处理数据库的方法,包括数据行字段的访问、不同数据读取器类的使用、数据库操作的整体流程以及常见问题的解决方法。希望这些知识能帮助你更好地进行数据库编程。

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

9. 连接对象的使用

连接对象在 ADO.NET 中支持与数据源的实际连接。常见的连接对象有 OleDbConnection SqlConnection OdbcConnection OracleConnection 。创建连接对象时,通常使用连接字符串,可将其传递给连接对象的构造函数或 ConnectionString 属性。确定特定数据源的连接字符串时,可使用 Visual Basic .NET 中的可视化工具,如数据适配器配置向导。

创建连接对象示例:

Dim Connection1String As New String( _
    "Provider=SQLOLEDB;Data Source=;User ID=sa;Initial Catalog=pubs;")
Dim Connection1 As New OleDbConnection(Connection1String)
10. 命令对象的使用

命令对象用于存储要在数据库中执行的 SQL 语句,可以创建用于从数据源选择数据、插入新记录、删除记录和更新数据库的命令对象。每个命令对象都可以关联一个连接对象。设置 SQL 语句时,可将其传递给命令对象的构造函数或使用 CommandText 属性,同时将 CommandType 属性设置为 CommandType.Text

创建命令对象示例:

Dim Command1 As New OleDbCommand("SELECT * FROM authors", Connection1)
11. 数据适配器对象的使用

数据适配器负责维护与数据源的连接,可将命令对象分配给数据适配器对象的 SelectCommand DeleteCommand UpdateCommand InsertCommand 属性。如果仅使用数据适配器获取数据,只需使用 SelectCommand 属性。使用数据适配器的 Fill 方法可将数据填充到数据集对象中。

使用数据适配器填充数据集示例:

Dim adapter As New OleDbDataAdapter(Command1)
Dim dataset As New DataSet()
adapter.Fill(dataset)
12. 数据表和记录的创建

可以创建 DataTable 对象来创建数据集中的数据表。创建数据表时,将表名传递给 DataTable 对象的构造函数,然后使用 DataColumn 对象配置每条记录中的字段。创建数据列时,将新字段的名称传递给 DataColumn 对象的构造函数,并使用 DataType 属性设置字段的数据类型,最后使用 Add 方法将新列添加到 DataTable 对象的 Columns 集合中。

创建数据表和列示例:

Dim table As New DataTable("Authors")
Dim column1 As New DataColumn("au_fname", GetType(String))
table.Columns.Add(column1)

使用 DataRow 对象创建新记录,使用表对象的 NewRow 方法创建新行,然后按名称为新行的字段赋值,最后使用表对象的 Rows 集合的 Add 方法将新行添加到表中。

创建记录示例:

Dim newRow As DataRow = table.NewRow()
newRow("au_fname") = "John"
table.Rows.Add(newRow)
13. 数据关系的创建

使用 DataRelation 对象可以在代码中创建数据关系。将想要创建的数据关系的名称以及要关联的两个表中的关键列传递给 DataRelation 对象的构造函数,然后使用 Add 方法将新的数据关系添加到数据集的 Relations 集合中。之后可以将控件绑定到数据关系对象,创建主/明细应用程序。

创建数据关系示例:

Dim relation As New DataRelation("AuthorBookRelation", table1.Columns("au_id"), table2.Columns("au_id"))
dataset.Relations.Add(relation)
14. 总结

在代码中处理数据库涉及多个方面,包括连接对象、命令对象、数据适配器对象、数据表和记录的创建以及数据关系的创建等。以下是这些操作的总结表格:
| 对象类型 | 作用 | 创建方法 | 关键操作 |
| — | — | — | — |
| 连接对象 | 连接数据源 | 使用连接字符串创建,如 OleDbConnection | Open() 打开连接 |
| 命令对象 | 存储和执行 SQL 语句 | OleDbCommand 等,设置 CommandText CommandType | 执行 SQL 操作 |
| 数据适配器对象 | 维护与数据源的连接 | 关联命令对象到相应属性 | Fill() 填充数据集 |
| 数据表对象 | 创建数据集中的数据表 | DataTable 构造函数指定表名 | 添加列和行 |
| 数据关系对象 | 创建表之间的关系 | DataRelation 构造函数指定关系名和关键列 | 添加到数据集的 Relations 集合 |

数据处理的流程可以用以下 mermaid 流程图表示:

graph LR
    A[创建连接对象] --> B[打开连接]
    B --> C[创建命令对象]
    C --> D[关联连接和命令对象]
    D --> E[使用数据适配器]
    E --> F[填充数据集]
    F --> G[创建数据表和记录]
    G --> H[创建数据关系]
    H --> I[使用数据读取器读取数据]

通过掌握这些知识和操作方法,你可以在代码中灵活处理数据库,虽然这需要一定的编程工作,但掌握后会带来很大的便利和价值。在实际应用中,要根据具体需求选择合适的对象和方法,不断实践和总结经验,提高数据库编程的能力。同时,遇到性能问题或其他疑问时,可参考前面提到的常见问题解答来解决。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值