在代码中处理数据库:全面指南
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 测验
-
如何使用连接对象指定要连接的数据源?
- 解答:使用特定于数据提供程序的连接字符串。
-
如何将 SQL 语句分配给命令对象?
-
解答:可以将 SQL 传递给命令对象的构造函数或
CommandText属性,同时将CommandType属性设置为CommandType.Text。
-
解答:可以将 SQL 传递给命令对象的构造函数或
-
如何将连接对象与命令对象关联?
-
解答:将连接对象分配给命令对象的
Connection属性,并调用连接对象的Open方法。
-
解答:将连接对象分配给命令对象的
-
数据适配器对象支持哪四个可以分配命令对象的属性?
-
解答:
SelectCommand、InsertCommand、DeleteCommand和UpdateCommand属性。如果只是从数据源获取数据,只需使用SelectCommand属性。
-
解答:
-
如何将
DataRow对象添加到DataTable对象中?-
解答:使用
DataTable对象的Rows集合的Add方法。
-
解答:使用
8.2 练习
-
创建一个新的 Windows 应用程序,当用户点击按钮时连接到
pubs数据库中的publishers表,并使用数据网格显示该表的数据。如果无法访问pubs数据库,可以使用其他数据库表进行相同的练习。 -
创建一个新的 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[使用数据读取器读取数据]
通过掌握这些知识和操作方法,你可以在代码中灵活处理数据库,虽然这需要一定的编程工作,但掌握后会带来很大的便利和价值。在实际应用中,要根据具体需求选择合适的对象和方法,不断实践和总结经验,提高数据库编程的能力。同时,遇到性能问题或其他疑问时,可参考前面提到的常见问题解答来解决。
超级会员免费看

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



