XML 数据库演示
本文将引导您创建一个简单的 Windows 数据库,并使用 Xml 文件作为其数据源。
Xml 数据库演示预览
![]() |
引言
我偶然发现了一个请求,要求创建一个以 Xml 文件作为数据源的数据库的逐步教程。既然我决定创建这个教程,我认为它可能对其他可能也有类似问题的新开发人员有用。所以,从头到尾,或者正如你可能说的“从 A 到 Z”,它就在这里。
背景
本文将引导您在 Visual Studio 中创建一个强类型 DataSet,该 DataSet 将用于存储数据、从 Xml 文件读取数据以及将数据写入 Xml 文件。
此外,本文还将引导您创建用于呈现数据的用户界面。
创建项目
要开始我们的演示,让我们创建项目
- 启动 Visual Studio
点击文件菜单 | 新建 | 项目…
当“新建项目”窗口打开时
展开 Visual Basic 节点
点击“Windows 应用程序”
将项目命名为“XmlDatabaseDemo”
然后点击“确定”按钮。
添加 DataSet
项目打开后,查看解决方案资源管理器
- 视图菜单 | 解决方案资源管理器
接下来,向项目添加一个 DataSet
- 点击项目菜单 | 添加新项…
选择一个 DataSet。
将名称更改为“DsXmlDbDemo”
(这表示“DataSet Xml 数据库演示”)
点击“添加”按钮。
![]() |
将 DataSet 添加到项目后,DataSet 设计器将立即打开。
添加 Customers DataTable
- 右键单击 DataSet 设计器。
选择添加 | DataTable
DataTable 将自动命名为“DataTable1”
点击“DataTable1”字样
您应该能够编辑名称。
将名称更改为“Customers”
现在我们已经将 Customers DataTable 添加到我们的 DataSet 中,我们需要添加一些列
向 Customers 表添加列
- 添加一个 AutoId 列
右键单击 Customers DataTable
选择添加 | 列
将新列的文本从“Column1”更改为“CustomerId”
- 现在我们已经添加了 ID 列,我们需要将其设为自动递增列,这样它将成为一个真正的 ID 列
- 左键单击我们刚刚添加的“CustomerId”列以选中它。
右键单击“CustomerId”列
从菜单中选择属性。
这应该已经打开了属性窗口。
在属性窗口中设置以下属性
- AutoIncrement = True
AutoIncrementSeed=0
AutoIncrementStep=1
DataType=System.Int32
Unique=True
- 左键单击我们刚刚添加的“CustomerId”列以选中它。
- 现在我们已经添加了 ID 列,我们需要将其设为自动递增列,这样它将成为一个真正的 ID 列
完成后,它应该如下所示
|
- 接下来,使用以下说明为每个列添加“Name”、“Address1”、“Address2”、“City”、“St”、“Zip”列
- 右键单击 DataTable
选择添加 | 列
将新列名更改为上面列出的列名之一。
对每个列重复此操作。
- 右键单击 DataTable
添加 Orders DataTable
现在我们已经在 DataSet 中添加了 Customer DataTable,让我们添加一个 Orders 表。Orders 表将用于跟踪我们客户的订单。
- 右键单击 DataSet 设计器。
选择添加 | DataTable
将 DataTable 重命名为“Orders”
向表中添加列
- 添加一个 AutoId 列
右键单击 Orders DataTable
选择添加 | 列
将新列的文本从“Column1”更改为“OrderId”
- 现在我们已经添加了 ID 列,我们需要将其设为自动递增列,这样它将成为一个真正的 ID 列。
- 左键单击我们刚刚添加的“OrderId”列以选中它。
右键单击“OrderId”列
从菜单中选择属性。
这应该已经打开了属性窗口。
在属性窗口中设置以下属性 -
AutoIncrement = True
AutoIncrementSeed=0
AutoIncrementStep=1
DataType=System.Int32
Unique=True
- 添加 CustomerId 列
因为添加到 Orders DataTable 的每个订单都属于一个客户,所以我们需要为 CustomerId 创建一个列。该列实际上将是一个“外键”,通常用“FK”表示,尽管我们不会在列名中实际使用“FK”。
- 右键单击 Orders DataTable
选择添加 | 列
将新列的文本更改为“CustomerId”
左键单击新的 CustomerId 列以选中它。
右键单击新的 CustomerId 列
选择属性。
将 DataType 属性设置为“System.Int32” - 添加 Item 列
- 右键单击 Orders DataTable
选择添加 | 列
将列重命名为“Item”
- 右键单击 Orders DataTable
- 添加 Quantity 列
- 右键单击 Orders DataTable
选择添加 | 列
将列重命名为“Quantity”
左键单击新的“Quantity”列以选中它
右键单击该列
选择属性。
将 DataType 属性设置为“System.Int32”
- 右键单击 Orders DataTable
- 添加 Price 列
- 右键单击 Orders DataTable
选择添加 | 列
将列重命名为“Price”
左键单击新的“Price”列以选中它
右键单击该列
选择属性。
将 DataType 属性设置为“System.Double”
- 右键单击 Orders DataTable
- 添加 Total 列
- 右键单击 Orders DataTable
选择添加 | 列
将列重命名为“Total”
左键单击新的“Total”列以选中它
右键单击该列
选择属性。
设置以下属性
DataType = "System.Double"
Expression = "Quantity*Price"
(此列将自动将 Quantity 和 Price 相乘)
- 右键单击 Orders DataTable
添加 DataTable 关系
现在我们的 DataSet 中有了 Customers 表和 Orders 表,我们需要在它们之间创建一个关系。这将使用 Customers DataTable 中的 CustomerId 列和 Orders DataTable 中的 CustomerId 列来完成。
- 左键单击(并按住)Customers DataTable 中的 CustomerId 列。
将鼠标拖到 Orders DataTable 中的 CustomerId 列上,然后松开。
(这将弹出关系窗口。)
- 按如下配置关系窗口
- 选择“关系和外键约束都选”
更新规则:级联
删除规则:级联。
窗口应如下所示
![]() |
最后,点击“确定”关闭关系窗口。
您的 DataSet 现在应该看起来像这样
![]() |
保存并生成您的项目(生成菜单 | 生成解决方案)。
不应该有错误。
关闭 DataSet 设计器窗口。
设计窗体
在设计器视图中转到您的窗体。
- 让我们更改窗体上的一些属性,使其看起来和响应更好一些
- 右键单击您的窗体。
选择属性。
在属性窗口中,设置以下属性
- BackColor: White
StartPosition: CenterScreen
Text: Xml 数据库演示
- BackColor: White
- 右键单击您的窗体。
- 现在让我们向窗体添加一些控件,以便我们可以查看数据
- 打开 DataSources 窗口
- 数据菜单 | 显示数据源
请注意 DataSources 窗口中的“DsXmlDbDemo”项。
这是我们刚刚创建的新 DataSet。
- 数据菜单 | 显示数据源
- 接下来,展开 Customers 节点。
您应该会看到 Customers DataTable 中的列列表
请注意列下方列出的 Orders DataTable。
您实际上应该看到 2 个 Orders DataTable。
出现在 Customers DataTable 中列下方的 Orders DataTable 实际上代表了 Orders DataTable 中的相关记录。
这就是我们要使用的 Orders DataTable。
- 打开 DataSources 窗口
![]() |
- 向窗体添加 Customer 列
- 要将列添加到窗体,只需为每个列执行以下步骤
- 左键单击(并按住)DataSources 窗口中的 CustomerId 列。
- 将列拖到窗体上,然后松开。
- 要将列添加到窗体,只需为每个列执行以下步骤
- 对所有列重复此操作,包括 Orders DataTable。
确保拖动 Customers DataTable 列下方的 Orders DataTable。
随意定位窗体上的控件。这是我的结果示例
![]() |
现在您可能已经注意到 Visual Studio 自动为我们添加了一些东西
- 窗体顶部现在有一个 BindingNavigator。这用于导航记录,以及添加和删除记录。
![]() |
- 我们的窗体下方的组件托盘中也有不少项。这些将由 Visual Studio 用于存储和管理我们的数据。
![]() |
添加代码
- 双击窗体上的蓝色标题栏。
这将创建一个 Form_Load 事件。
- 在创建的新 Form_Load 事件的正上方,添加一个模块级变量来存储将存储我们数据的 Xml 文件的文件路径
Private mXmlFilePath As String = "c:\Temp\XmlDatabaseDemo.xml"
- 接下来,在 Form_Load 事件中,添加一行代码,检查 Xml 文件是否存在,如果存在,则使用 DsXmlDbDemo 数据集的 ReadXml 方法从文件中读取数据并将其加载到 DataSet 中
If My.Computer.FileSystem.FileExists(mXmlFilePath) = True Then _
DsXmlDbDemo.ReadXml(mXmlFilePath)
- 添加保存:既然数据加载正确,让我们更新数据的保存。
- 右键单击代码窗口
选择查看设计器
在窗体顶部的 BindingNavigator 上,查找保存按钮。
此按钮上有一个软盘图标,并且应该呈灰色。
- 右键单击代码窗口
- 启用保存按钮
- 左键单击按钮
右键单击按钮
选择属性
将 Enabled 属性设置为“True”
- 左键单击按钮
-
双击保存按钮以创建 CustomersBindingNavigatorSaveItem_Click 事件。
最后,只需将这些代码行添加到保存事件以将数据保存到文件
Me.Validate()
CustomersBindingSource.EndEdit()
OrdersBindingSource.EndEdit()
DsXmlDbDemo.WriteXml(mXmlFilePath)
这些方法将数据提交到 Customers DataTable 和 Orders DataTable
- 注意:您可以将这些代码行放在 Form_Closing 事件中,并且只将数据一次写入 Xml 文件。这样做的一个缺点是,如果应用程序意外关闭(由于错误、网络连接失败、断电等),那么用户将丢失所有已输入的数据。所以这取决于您。
再添加一段代码,在进行订单输入之前提交任何待处理的客户条目。
- 右键单击代码窗口。
选择查看设计器。
左键单击窗体上的 Orders 网格 (DataGridView)。
右键单击网格。
选择属性。
- 查看网格的事件
在属性窗口中,在最顶部查找黄色闪电,然后
点击它以查看网格的事件。
找到“Enter”方法。
双击“Enter”字样以创建 OrdersDataGridView_Enter 事件。
将以下代码行添加到此事件
CustomersBindingSource.EndEdit()
最终代码应该是这样的:
![]() |
运行程序
- 程序运行时,首先点击窗体顶部 BindingNavigator 上的黄色加号 (+) 添加您的第一条记录。
- 向窗体添加客户。
- 为每个客户添加一些订单。
- 请注意以下事项
- OrderId 号码会自动填写。这是因为它是自动递增的号码。
- CustomerId 号码会自动填写为当前客户的 CustomerId 号码。
- 当您离开行时,Total 列会自动计算 Quantity 和 Price。
- 点击保存按钮以保存客户和订单。
- 关闭程序,然后再次运行程序以验证您的条目是否在那里!
结论
我已经为您提供了本教程的源代码。所以,如果您有任何问题,可以查看它。
希望对您有所帮助!
VBRocks
2008 MS Visual Basic MVP