代码中处理数据库的全面指南
在编程中,数据库操作是一项至关重要的技能。本文将详细介绍如何在代码中连接数据库、填充数据集、创建数据表、建立数据关系以及读取表中单元格的数据。
1. 从数据库获取表
要从数据库中获取
authors
表,可按以下步骤操作:
1. 创建
OleDbDataAdapter
对象。
2. 将命令对象分配给该适配器的
SelectCommand
属性。
3. 调用数据适配器的
Fill
方法执行命令对象中的 SQL 语句。
4. 指定要将数据存储在数据集中的表名。
5. 将填充后的数据集绑定到数据网格。
以下是示例代码:
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 OleDbDataAdapter1 As OleDbDataAdapter = New OleDbDataAdapter()
OleDbDataAdapter1.SelectCommand = Command1
OleDbDataAdapter1.Fill(dataset1, "authors")
DataGrid1.SetDataBinding(dataset1, "authors")
End Sub
2. 用自定义数据填充数据集
无需连接外部数据源,也能创建数据集。可以创建自己的数据表并填充数据,步骤如下:
1. 引入
DataTable
类。
2. 创建
DataTable
对象。
3. 设置表的列。
4. 创建
DataRow
对象并填充数据。
5. 将数据表添加到数据集中。
6. 将数据集绑定到数据网格。
2.1 使用
DataTable
类
DataTable
类表示数据表,数据集由数据表集合组成。其层次结构如下:
System.Object
System.ComponentModel.MarshalByValueComponent
System.Data.DataTable
DataTable
对象的重要公共属性、方法和事件如下表所示:
| 属性 | 含义 |
| ---- | ---- |
|
ChildRelations
| 返回此表的子关系 |
|
Columns
| 返回此表中的列 |
|
Constraints
| 返回此表的约束 |
|
DataSet
| 返回此表所属的数据集 |
|
HasErrors
| 指示表中任何行是否有错误 |
|
MinimumCapacity
| 返回或设置表的起始大小 |
|
ParentRelations
| 返回此表的父关系 |
|
PrimaryKey
| 返回或设置充当主键的列 |
|
Rows
| 返回此表中的行 |
|
TableName
| 返回或设置表的名称 |
| 方法 | 含义 |
|---|---|
AcceptChanges
| 接受(提交)对表所做的更改 |
Clear
| 清除表中的数据 |
Copy
| 复制表 |
GetChanges
|
返回自上次调用
AcceptChanges
方法以来对表所做的所有更改的副本
|
GetErrors
| 返回包含错误的行 |
ImportRow
| 将一行复制到表中 |
LoadDataRow
| 查找并更新一行;如果找不到该行,则创建一个新行 |
NewRow
| 创建一个新的空行,包含表中每行的所有字段 |
RejectChanges
|
回滚自表创建以来或自调用
AcceptChanges
方法以来对表所做的更改
|
Select
| 返回行的数组 |
| 事件 | 含义 |
|---|---|
ColumnChanged
| 列中的值更改后发生 |
ColumnChanging
| 列的值正在更改时发生 |
RowChanged
| 行更改后发生 |
RowChanging
| 行正在更改时发生 |
RowDeleted
| 行删除后发生 |
RowDeleting
| 行即将删除时发生 |
以下是创建
DataTable
的示例代码:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim Table1 As DataTable
Table1 = New DataTable("Customers")
'设置列
Dim FirstName As DataColumn = New DataColumn("First Name")
FirstName.DataType = System.Type.GetType("System.String")
Table1.Columns.Add(FirstName)
Dim LastName As DataColumn = New DataColumn("Last Name")
LastName.DataType = System.Type.GetType("System.String")
Table1.Columns.Add(LastName)
Dim Phone As DataColumn = New DataColumn("Phone")
Phone.DataType = System.Type.GetType("System.String")
Table1.Columns.Add(Phone)
Dim ID As DataColumn = New DataColumn("ID")
ID.DataType = System.Type.GetType("System.Int32")
Table1.Columns.Add(ID)
'创建行
Dim Row1, Row2, Row3, Row4 As DataRow
Row1 = Table1.NewRow()
Row1("First Name") = "Cary"
Row1("Last Name") = "Grant"
Row1("Phone") = "(555) 499-1234"
Row1("ID") = 2345
Table1.Rows.Add(Row1)
Row2 = Table1.NewRow()
Row2("First Name") = "Jimmy"
Row2("Last Name") = "Stewart"
Row2("Phone") = "(555) 499-4321"
Row2("ID") = 2346
Table1.Rows.Add(Row2)
Row3 = Table1.NewRow()
Row3("First Name") = "Grace"
Row3("Last Name") = "Kelly"
Row3("Phone") = "(555) 499-9999"
Row3("ID") = 2347
Table1.Rows.Add(Row3)
Row4 = Table1.NewRow()
Row4("First Name") = "Janet"
Row4("Last Name") = "Leigh"
Row4("Phone") = "(555) 499-1010"
Row4("ID") = 2348
Table1.Rows.Add(Row4)
'添加到数据集
Dim dataset1 As New DataSet
dataset1 = New DataSet
dataset1.Tables.Add(Table1)
DataGrid1.SetDataBinding(dataset1, "Customers")
End Sub
2.2 使用
DataColumn
类
DataColumn
对象表示数据表中的列,其层次结构如下:
System.Object
System.ComponentModel.MarshalByValueComponent
System.Data.DataColumn
DataColumn
对象的重要公共属性如下表所示:
| 属性 | 含义 |
| ---- | ---- |
|
AllowDBNull
| 返回或设置是否允许空值 |
|
AutoIncrement
| 返回或设置在向表中添加新行时列是否自动递增列的值 |
|
AutoIncrementSeed
| 返回或设置自动递增列的起始值 |
|
AutoIncrementStep
| 返回或设置自动递增列的增量 |
|
Caption
| 返回或设置列的标题 |
|
ColumnName
| 返回或设置列的名称 |
|
DataType
| 返回或设置列中的数据类型 |
|
DefaultValue
| 返回或设置列的默认值(用于新行) |
|
Expression
| 返回或设置用于计算值、创建聚合值等的表达式 |
|
MaxLength
| 返回或设置文本列的最大长度 |
|
Ordinal
| 返回列在
Columns
集合中的位置 |
|
ReadOnly
| 返回或设置列是否为只读 |
|
Table
| 返回列所属的表 |
|
Unique
| 返回或设置此列中的值是否必须唯一 |
2.3 使用
DataRow
类
DataRow
对象用于访问、插入、删除和更新表中的记录,其层次结构如下:
System.Object
System.Data.DataRow
DataRow
对象的重要公共属性和方法如下表所示:
| 属性 | 含义 |
| ---- | ---- |
|
HasErrors
| 指示行中是否有错误 |
|
Item
| 返回或设置指定列中的数据 |
|
ItemArray
| 返回或设置行中的所有数据 |
|
RowError
| 返回或设置行的错误描述 |
|
RowState
| 返回行的当前状态 |
|
Table
| 返回包含此行的表 |
| 方法 | 含义 |
|---|---|
AcceptChanges
| 接受(提交)对行所做的更改 |
BeginEdit
| 开始编辑操作 |
CancelEdit
| 取消当前编辑操作 |
ClearErrors
| 清除行中的错误 |
Delete
| 删除行 |
EndEdit
| 结束当前编辑操作 |
GetChildRows
| 返回行的子行 |
GetColumnError
| 返回列的错误描述 |
GetColumnsInError
| 返回有错误的列 |
GetParentRow
| 返回行的父行 |
GetParentRows
| 返回行的父行 |
IsNull
| 指示列是否包含空值 |
RejectChanges
|
回滚自表创建以来或自调用
AcceptChanges
方法以来对表所做的更改
|
SetColumnError
| 设置列的错误描述 |
SetParentRow
| 设置行的父行 |
3. 在代码中创建数据关系
数据集只是将数据存储在表中,本身并不知道表之间的关系。可以使用
DataRelation
对象来建立表之间的关系,步骤如下:
1. 添加 SQL 数据适配器以返回所需的表。
2. 生成包含这些表的新数据集。
3. 创建
DataColumn
对象以表示关联列。
4. 创建
DataRelation
对象。
5. 将数据关系添加到数据集中。
6. 将数据关系绑定到数据网格。
DataRelation
类的层次结构如下:
System.Object
System.Data.DataRelation
DataRelation
对象的重要公共属性如下表所示:
| 属性 | 含义 |
| ---- | ---- |
|
ChildColumns
| 返回关系的子列对象 |
|
ChildTable
| 返回此关系的子表 |
|
DataSet
| 返回关系所属的数据集 |
|
ParentColumns
| 返回关系的父列对象 |
|
ParentTable
| 返回此关系的父表 |
|
RelationName
| 返回或设置关系的名称 |
以下是创建数据关系的示例代码:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
DataSet11.Clear()
SqlDataAdapter1.Fill(DataSet11)
SqlDataAdapter2.Fill(DataSet11)
Dim colPublishers As DataColumn
Dim colTitles As DataColumn
colPublishers = DataSet11.Tables("publishers").Columns("pub_id")
colTitles = DataSet11.Tables("titles").Columns("pub_id")
Dim publisherstitles As DataRelation
publisherstitles = New DataRelation("publisherstitles", colPublishers, _
colTitles)
DataSet11.Relations.Add(publisherstitles)
DataGrid1.SetDataBinding(DataSet11, "publishers.publisherstitles")
End Sub
4. 在代码中读取表中单元格的数据
要处理表中的数据,必须能够访问表中单元格的数据。步骤如下:
1. 创建新的 Windows 应用程序。
2. 创建连接到数据库表的 SQL 数据适配器。
3. 生成包含该表的新数据集。
4. 添加多行文本框和按钮。
5. 当用户点击按钮时,填充数据集。
6. 显示列名。
7. 循环遍历表中的记录,显示每个记录的前四个字段的数据。
以下是读取表中单元格数据的示例代码:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
DataSet11.Clear()
SqlDataAdapter1.Fill(DataSet11)
TextBox1.Text &= DataSet11.Tables("authors").Columns(0).ColumnName & _
ControlChars.CrLf
TextBox2.Text &= DataSet11.Tables("authors").Columns(1).ColumnName & _
ControlChars.CrLf
TextBox3.Text &= DataSet11.Tables("authors").Columns(2).ColumnName & _
ControlChars.CrLf
TextBox4.Text &= DataSet11.Tables("authors").Columns(3).ColumnName & _
ControlChars.CrLf
TextBox1.Text &= "------------" & ControlChars.CrLf
TextBox2.Text &= "------------" & ControlChars.CrLf
TextBox3.Text &= "------------" & ControlChars.CrLf
TextBox4.Text &= "------------" & ControlChars.CrLf
For RowLoopIndex As Integer = 0 To _
(DataSet11.Tables("authors").Rows.Count - 1)
TextBox1.Text &= DataSet11.Tables("authors").Rows( _
RowLoopIndex).Item(0) & ControlChars.CrLf
Next RowLoopIndex
For RowLoopIndex As Integer = 0 To _
(DataSet11.Tables("authors").Rows.Count - 1)
TextBox2.Text &= DataSet11.Tables("authors").Rows( _
RowLoopIndex).Item(1) & ControlChars.CrLf
Next RowLoopIndex
For RowLoopIndex As Integer = 0 To _
(DataSet11.Tables("authors").Rows.Count - 1)
TextBox3.Text &= DataSet11.Tables("authors").Rows( _
RowLoopIndex).Item(2) & ControlChars.CrLf
Next RowLoopIndex
For RowLoopIndex As Integer = 0 To _
(DataSet11.Tables("authors").Rows.Count - 1)
TextBox4.Text &= DataSet11.Tables("authors").Rows( _
RowLoopIndex).Item(3) & ControlChars.CrLf
Next RowLoopIndex
End Sub
通过以上步骤和示例代码,你可以在代码中完成数据库的连接、数据填充、表创建、关系建立和数据读取等操作。
代码中处理数据库的全面指南(续)
5. 操作流程总结
为了更清晰地展示上述操作的流程,下面给出相应的 mermaid 流程图。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(连接数据库):::process
B --> C(获取表数据):::process
C --> D{是否自定义数据}:::decision
D -->|是| E(创建数据表):::process
D -->|否| F(使用已有表):::process
E --> G(设置列):::process
G --> H(创建行并填充数据):::process
H --> I(添加到数据集):::process
F --> I
I --> J(创建数据关系):::process
J --> K(读取单元格数据):::process
K --> L([结束]):::startend
6. 关键技术点分析
在上述操作中,涉及到了几个关键的技术点,下面进行详细分析。
6.1 数据集与数据表的关系
数据集(DataSet)就像是一个容器,它可以包含多个数据表(DataTable)。数据表则是存储实际数据的地方,每一行代表一条记录,每一列代表一个字段。通过
DataSet.Tables
属性可以访问数据集中的所有数据表,通过
DataTable.Rows
和
DataTable.Columns
可以分别访问表中的行和列。
6.2 数据关系的作用
数据关系(DataRelation)用于建立数据表之间的关联。在实际应用中,不同的表之间往往存在着某种联系,例如一对多、多对多等关系。通过
DataRelation
对象,可以将这些关系在代码中明确地表示出来,从而方便地进行数据的查询和展示。例如,在前面的示例中,通过
pub_id
字段将
publishers
表和
titles
表关联起来,当用户选择一个出版商时,就可以显示该出版商的所有书籍。
6.3 数据行的操作
数据行(DataRow)是数据表中的核心元素,它包含了具体的数据。通过
DataRow
对象,可以对数据进行插入、删除、更新等操作。例如,使用
NewRow
方法创建新行,使用
Add
方法将新行添加到数据表中,使用
Delete
方法删除行等。同时,还可以通过
BeginEdit
、
EndEdit
和
CancelEdit
方法来控制对行的编辑操作。
7. 常见问题及解决方案
在进行数据库操作时,可能会遇到一些常见的问题,下面给出相应的解决方案。
| 问题 | 解决方案 |
|---|---|
| 数据库连接失败 | 检查连接字符串是否正确,确保数据库服务已启动,检查数据库的权限设置。 |
| 数据填充失败 | 检查 SQL 语句是否正确,确保数据适配器能够正确返回数据,检查数据集和数据表的设置。 |
| 数据关系创建失败 | 检查关联列是否正确,确保关联列的数据类型和名称一致,检查数据集和数据表的设置。 |
| 读取单元格数据出错 | 检查列名和索引是否正确,确保数据表中包含所需的列,检查数据类型是否匹配。 |
8. 总结
通过本文的介绍,我们学习了如何在代码中处理数据库,包括从数据库获取表、用自定义数据填充数据集、创建数据关系以及读取表中单元格的数据等操作。我们了解了
DataSet
、
DataTable
、
DataColumn
、
DataRow
和
DataRelation
等重要类的使用方法,掌握了数据库操作的基本流程和关键技术点。同时,我们还对常见问题进行了分析,并给出了相应的解决方案。希望这些内容能够帮助你更好地进行数据库编程。
在实际应用中,你可以根据具体的需求对上述代码进行修改和扩展,以实现更复杂的数据库操作。例如,你可以添加更多的表和数据关系,实现更强大的数据查询和展示功能;你还可以对数据进行验证和处理,确保数据的完整性和准确性。总之,数据库编程是一个广阔的领域,需要不断地学习和实践才能掌握。
超级会员免费看
177万+

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



