数据库操作:从Windows控件到代码实现
1. Windows控件与数据库交互
在数据库操作中,使用Windows控件与数据库交互是重要的一环。
-
简单绑定控件
:简单绑定控件用于显示单条记录中单个字段的数据,如文本框、复选框、单选按钮、标签和按钮等。在设计时,可以使用
(DataBindings)
属性进行绑定。该属性会列出每个控件常用的绑定属性,例如文本框和标签的
Text
属性。通过从出现的下拉列表中选择数据库表及其字段,即可将这些属性绑定到数据源。还可以在
(DataBindings)
属性条目中选择
(Advanced)
属性,将简单绑定控件的几乎所有属性绑定到数据源,但要注意属性的数据类型必须与数据源中绑定的字段相同。在代码中,可以使用控件的
(DataBindings)
属性来设置简单绑定,该属性包含一个与控件绑定对应的
Binding
对象集合。
-
复杂绑定控件
:复杂绑定控件可以同时显示多个字段的数据,包括组合框、列表框和数据网格。复杂绑定主要围绕四个属性:
DataSource
(数据源)、
DataMember
(数据源中要操作的成员,通常是数据库表)、
DisplayMember
(控件要显示数据的字段)和
ValueMember
(控件在
SelectedValue
等属性中返回数据的字段)。例如,在列表框中使用
DisplayMember
和
ValueMember
属性,可以显示作者的姓氏,但在用户点击某个姓名时,代码中传递作者的ID。
-
记录导航
:由于简单绑定控件每次只能显示单条记录中的单个字段数据,因此让用户能够在记录间导航很重要。可以使用Windows窗体中绑定上下文的方法让用户导航数据,特别是使用窗体的
BindingContext
属性,该属性返回一个
BindingManagerBase
类的对象,用于设置窗体中所有控件的当前记录。可以使用
BindingManagerBase
对象的
Position
属性设置当前记录,使用
Count
属性确定记录总数。
-
数据网格
:数据网格在数据绑定方面表现出色,对其进行了深入介绍。
-
数据表单向导
:数据表单向导是Visual Basic用于自动创建数据输入表单的工具。使用该向导创建数据输入表单并剖析其代码,可以了解它如何添加新记录、删除记录、取消编辑以及更新底层数据源。
-
数据验证
:在处理数据输入表单时,可以使用错误提供程序验证Windows窗体中控件的数据。当控件失去焦点给
CausesValidation
属性设置为
True
(默认值)的控件或窗体时,该控件的
Validating
事件会触发,可以在该事件处理程序中检查控件中的数据。使用错误提供程序的
SetError
方法显示错误,将错误设置为空字符串
""
可移除闪烁图标,错误图标显示时,其工具提示会显示指定的错误消息。
-
SQL参数
:SQL参数类似于SQL语句中的变量,可以在不重写SQL本身的情况下为其赋值。了解了如何创建SQL参数、在运行时为其赋值以及如何使用生成的SQL语句处理数据源中的数据。
-
数据关系对象
:可以使用数据关系对象在不使用SQL的情况下建立表之间的连接。
2. 相关问答与练习
-
问答
-
问题1
:数据网格能否显示分层表(每个单元格本身可以包含一个表)?
答:可以。当在数据网格中显示分层表时,字段本身可以显示指向子表的类似Web的链接。点击链接可以导航到子表,显示子表时,标题中会出现一个返回按钮,点击可导航回父表。 -
问题2
:错误图标显示的工具提示效果不佳,用户看不到且被闪烁图标弄糊涂,有没有更好的方法?
答:在工具提示中显示错误消息对某些用户来说可能过于隐蔽。更好的选择是在错误提供程序的Validating事件处理程序中添加代码,在消息框或表单中的标签中显示错误消息,标签可放在错误图标旁边。
-
问题1
:数据网格能否显示分层表(每个单元格本身可以包含一个表)?
-
练习
-
若能访问SQL Server的
pubs数据库,将多个简单绑定控件绑定到该数据库titles表的title字段,同时将一些复杂绑定控件也绑定到该表,最后添加标准导航按钮让用户浏览该表中的记录。若无法访问pubs数据库,则对其他数据库表执行相同练习。 -
使用数据表单向导为
pubs数据库的titles表创建数据输入表单,根据需要重新排列创建的数据表单中的绑定控件,并使用该表单更改titles表中一条记录的数据,以确认一切正常工作。若无法访问pubs数据库,则对其他数据库表执行相同练习。
-
若能访问SQL Server的
3. 使用代码处理数据库
在Visual Basic .NET中,有两种主要的数据库操作方式:使用可视化工具和使用代码。可视化工具适合在设计时设置所有内容,但如果要在运行时连接到各种数据库,则必须使用代码,而且有些操作,如使用数据读取器,无法使用可视化工具完成。要使用代码处理数据库,需要熟悉许多ADO.NET对象,以下是今天要处理的主题:
- 连接对象
- 命令对象
- 数据适配器对象
- 数据集对象
- 数据读取器对象
- 数据表对象
- 数据行和列对象
- 数据关系对象
- 在代码中创建数据集
- 在代码中创建数据连接
- 在代码中创建命令对象
- 在代码中创建数据适配器
- 在代码中创建数据表
- 在代码中创建数据关系对象
- 从代码中访问表单元格中的数据
- 在代码中使用数据读取器
4. 连接对象
要在数据库和应用程序之间移动数据,首先需要与数据库建立连接。在ADO.NET中,可以使用以下连接对象创建和管理连接:
|连接对象|说明|
| ---- | ---- |
|
OleDbConnection
|管理与任何可通过OLE DB协议访问的数据源的连接|
|
SqlConnection
|管理与SQL Server 7.0或更高版本的连接,针对SQL Server 7.0或更高版本进行了优化|
|
OdbcConnection
|管理与使用ODBC连接字符串或ODBC数据源名称(DSN)创建的数据源的连接|
|
OracleConnection
|管理与Oracle数据库的连接|
下面分别介绍这些连接对象的使用。
5. OleDbConnection类的使用
OleDbConnection
对象支持与OLE DB数据提供程序的连接,可以与许多数据提供程序一起使用(但要注意,根据提供程序的不同,并非
OleDbConnection
对象的所有属性都能得到支持)。建立与数据库的连接步骤如下:
-
创建连接字符串
:连接字符串包含用于登录数据提供程序并选择特定数据库所需的数据的属性/值对,这些属性/值对由分号分隔。可以将连接字符串分配给连接的
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)
如果不知道如何为特定数据提供程序创建连接字符串,可以使用Visual Basic内置的可视化工具构建一些示例字符串,然后直接在代码中使用或根据需要进行修改。具体做法是将数据适配器拖到项目的主窗体上,这会创建数据连接和数据适配器对象,使用数据适配器配置向导配置数据适配器后,在属性窗口中查看连接对象的
ConnectionString
属性。
-
打开连接并操作
:创建连接对象后,使用
Open
方法打开它,并将其分配给命令对象的
Connection
属性(可以将所需的SQL传递给命令对象的构造函数)。然后可以将命令对象与数据适配器一起使用,例如将命令对象分配给数据适配器的
SelectCommand
属性,使用数据适配器的
Fill
方法执行该命令并填充数据集。完成连接后,使用
Close
方法关闭连接。
OleDbConnection
类的层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.OleDb.OleDbConnection]
OleDbConnection
对象的重要公共属性、方法和事件如下表所示:
|属性|说明|
| ---- | ---- |
|
ConnectionString
|返回或设置打开数据库的连接字符串|
|
ConnectionTimeout
|返回尝试建立连接时的等待时间(以秒为单位)|
|
Database
|返回要打开的数据库的名称|
|
DataSource
|返回数据源(通常是要打开的位置和文件名)|
|
Provider
|返回OLE DB提供程序的名称|
|
ServerVersion
|返回服务器的版本|
|
State
|返回连接的当前状态|
| 方法 | 说明 |
|---|---|
BeginTransaction
| 开始数据库事务 |
ChangeDatabase
| 更改当前数据库 |
Close
| 关闭与数据提供程序的连接 |
CreateCommand
|
为该连接创建一个
OleDbCommand
对象
|
GetOleDbSchemaTable
| 返回当前架构表 |
Open
| 打开数据库连接 |
| 事件 | 说明 |
|---|---|
InfoMessage
| 如果提供程序发送消息(包括警告),则触发该事件 |
StateChange
| 当连接状态改变时触发该事件 |
6. SqlConnection类的使用
SqlConnection
对象支持与SQL Server数据库的连接,这些连接针对SQL Server进行了优化。与
OleDbConnection
对象相比,编程接口非常相似,但连接字符串不同。例如创建
SqlConnection
对象的代码如下:
Dim ConnectionString As String = "workstation id=STEVE;" & _
"packet size=4096;integrated security=SSPI;initial" & _
"catalog=pubs;persist security info=False"
Dim Connection1 As SqlConnection = New SqlConnection(ConnectionString)
从代码角度来看,主要区别在于性能,与Microsoft SQL Server的SQL连接比OLE DB连接快达70%,因此如果使用SQL Server,建议对所有连接都使用SQL连接。
SqlConnection
类的层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.SqlClient.SqlConnection]
SqlConnection
类的重要公共属性、方法和事件与
OleDbConnection
类基本相同,但不支持
GetOleDbSchema
方法,还支持以下额外属性:
|属性|说明|
| ---- | ---- |
|
PacketSize
|返回要使用的通信数据包的大小(以字节为单位)|
|
WorkstationId
|返回数据库客户端ID|
7. OdbcConnection类的使用
要连接到ODBC数据库,可以使用
OdbcConnection
类。ODBC连接由Windows中的内置ODBC驱动程序管理,使用ODBC数据源管理员创建和管理这些数据源(打开该工具的方式因操作系统而异,例如在Windows 2000中,在控制面板中选择“管理工具”图标,然后打开“数据源(ODBC)”图标)。使用ODBC数据源管理员将数据源与数据源名称(DSN)关联,与
OdbcConnection
连接对象一起使用的连接字符串会指定DSN名称。例如:
Dim ConnectionString As String = "MaxBufferSize=2048;FIL=MSAccess;" & _
"DSN=students;PageTimeout=5;UID=admin;DBQ=C:\students.mdb;DriverId=25"
Dim OdbcConnection1 As System.Data.Odbc.OdbcConnection = New System.Data.Odbc.OdbcConnection(ConnectionString)
如果需要帮助创建有效的连接字符串,可以使用Visual Basic可视化工具创建一些连接,然后查看连接的
ConnectionString
属性。
OdbcConnection
类的层次结构如下:
graph LR
A[System.Object] --> B[System.MarshalByRefObject]
B --> C[System.ComponentModel.Component]
C --> D[System.Data.Odbc.OdbcConnection]
OdbcConnection
类的重要公共属性、方法和事件与
OleDbConnection
类基本相同,但不支持
GetOleDbSchema
方法,还支持以下额外属性:
|属性|说明|
| ---- | ---- |
|
Driver
|返回当前连接的ODBC驱动程序的名称|
数据库操作:从Windows控件到代码实现
8. 命令对象与数据适配器对象
在使用代码操作数据库时,命令对象和数据适配器对象起着关键作用。
-
命令对象
:命令对象用于执行SQL语句或存储过程。可以将连接对象分配给命令对象的
Connection
属性,将所需的SQL语句传递给命令对象的构造函数。例如:
Dim ConnectionString As String = "workstation id=STEVE;packet size=4096;integrated security=SSPI;initial catalog=pubs;persist security info=False"
Dim Connection1 As SqlConnection = New SqlConnection(ConnectionString)
Dim sql As String = "SELECT * FROM titles"
Dim Command1 As SqlCommand = New SqlCommand(sql, Connection1)
-
数据适配器对象
:数据适配器对象充当数据源和数据集之间的桥梁。可以将命令对象分配给数据适配器的
SelectCommand属性,使用数据适配器的Fill方法将数据从数据源填充到数据集。例如:
Dim DataAdapter1 As SqlDataAdapter = New SqlDataAdapter()
DataAdapter1.SelectCommand = Command1
Dim DataSet1 As DataSet = New DataSet()
DataAdapter1.Fill(DataSet1, "titles")
9. 数据集对象与数据表对象
-
数据集对象
:数据集对象是一个内存中的数据库副本,包含多个数据表和它们之间的关系。可以使用数据适配器的
Fill方法将数据填充到数据集。例如上述代码中已经将titles表的数据填充到了DataSet1中。 -
数据表对象
:数据表对象是数据集中的一个表,包含行和列。可以通过数据集的
Tables属性访问数据表。例如:
Dim DataTable1 As DataTable = DataSet1.Tables("titles")
数据表对象有许多属性和方法,以下是一些常用的:
|属性/方法|说明|
| ---- | ---- |
|
Rows
|获取数据表中的行集合|
|
Columns
|获取数据表中的列集合|
|
TableName
|获取或设置数据表的名称|
|
AcceptChanges
|提交自上次调用
AcceptChanges
以来对数据表所做的所有更改|
|
RejectChanges
|回滚自上次调用
AcceptChanges
以来对数据表所做的所有更改|
10. 数据读取器对象
数据读取器对象用于从数据源中快速、只进、只读地读取数据。使用数据读取器对象需要先执行命令对象的
ExecuteReader
方法。例如:
Connection1.Open()
Dim Reader1 As SqlDataReader = Command1.ExecuteReader()
While Reader1.Read()
Console.WriteLine(Reader1("title"))
End While
Reader1.Close()
Connection1.Close()
数据读取器对象的优点是读取数据速度快,占用资源少,但只能向前读取数据,不能修改数据。
11. 数据行和列对象
-
数据行对象
:数据行对象代表数据表中的一行数据。可以通过数据表的
Rows属性访问数据行。例如:
Dim DataRow1 As DataRow = DataTable1.Rows(0)
可以通过列名或列索引访问数据行中的数据。例如:
Dim title As String = DataRow1("title")
-
数据列对象
:数据列对象代表数据表中的一列。可以通过数据表的
Columns属性访问数据列。例如:
Dim DataColumn1 As DataColumn = DataTable1.Columns("title")
数据列对象有许多属性,如
ColumnName
(列名)、
DataType
(数据类型)等。
12. 数据关系对象
数据关系对象用于建立数据表之间的关系。在不使用SQL的情况下,可以使用数据关系对象连接表中的数据。创建数据关系对象的步骤如下:
1. 获取要建立关系的两个数据表。
2. 获取两个数据表中用于建立关系的列。
3. 创建
DataRelation
对象。
4. 将
DataRelation
对象添加到数据集的
Relations
集合中。
例如:
Dim DataSet2 As DataSet = New DataSet()
Dim DataTable2 As DataTable = New DataTable("Authors")
Dim DataTable3 As DataTable = New DataTable("Books")
DataSet2.Tables.Add(DataTable2)
DataSet2.Tables.Add(DataTable3)
Dim Column1 As DataColumn = DataTable2.Columns("author_id")
Dim Column2 As DataColumn = DataTable3.Columns("author_id")
Dim Relation1 As DataRelation = New DataRelation("Author_Book_Relation", Column1, Column2)
DataSet2.Relations.Add(Relation1)
13. 代码中创建各种对象的总结
以下是在代码中创建各种数据库相关对象的流程图:
graph LR
A[开始] --> B[创建连接对象]
B --> C[创建命令对象]
C --> D[创建数据适配器对象]
D --> E[创建数据集对象]
E --> F[创建数据表对象]
F --> G[创建数据关系对象]
G --> H[使用数据读取器对象读取数据]
H --> I[结束]
在代码中操作数据库时,需要按照一定的顺序创建和使用这些对象,才能正确地实现数据的读取、插入、更新和删除等操作。
14. 总结与回顾
通过以上内容,我们全面了解了从使用Windows控件与数据库交互到使用代码操作数据库的过程。
- 在使用Windows控件时,掌握了简单绑定控件和复杂绑定控件的使用方法,以及如何进行记录导航、数据验证等操作。
- 在使用代码操作数据库时,熟悉了各种ADO.NET对象,包括连接对象、命令对象、数据适配器对象、数据集对象、数据读取器对象、数据表对象、数据行和列对象以及数据关系对象。了解了如何在代码中创建这些对象,以及如何使用它们进行数据的读取、写入和管理。
在实际开发中,可以根据具体需求选择合适的方式进行数据库操作。如果需要快速开发,使用Windows控件和可视化工具是不错的选择;如果需要更灵活的操作和更好的性能,使用代码实现则更为合适。希望这些知识能帮助你在数据库开发中更加得心应手。
数据库操作:从控件到代码
超级会员免费看
797

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



