XML 数据库架构和数据编辑器






4.91/5 (45投票s)
查看和编辑您的 XML 数据库架构和数据。
引言
在我发表了关于 C# 中动态菜单的最新文章之后,一些人评论说我应该在 XML 中而不是在 Access 中实现菜单结构。好吧...我想,然后开始在 VS.NET IDE 中使用 XML 模式。 我很快对创建模式和编辑其内容的能力感到失望。IDE 的行为与文档所说的不同,并且行为显得不一致且有错误。 你们中的一些人评论说你们没有遇到这种行为,但我确实遇到了。我还想要一个独立于 IDE 的 XML 模式/数据编辑器(无论是否需要安装 20MB 的 dotnetfx.exe 文件!)。
在浏览 CP 和 Google 之后,我没有看到任何属于基本模式和数据编辑器范畴的东西,所以以下是结果。 即使我重复了工作,我也在此过程中学到了一些东西,并且由于没有先前的 XML 经验,这可能是价值所在。
实际上没有什么火箭科学的东西,但我还是会展示一些代码。
加载 XML 文件
private void mnuOpen_Click(object sender, System.EventArgs e)
{
DialogResult res=openFileDialog.ShowDialog(this);
if (res==DialogResult.OK)
{
string fn=openFileDialog.FileName;
DataSet ds=new DataSet();
ds.ReadXml(fn);
lbTables.Items.Clear();
foreach (DataTable dt in ds.Tables)
{
lbTables.Items.Add(dt.TableName);
}
dataSet=ds;
lbTables.SelectedIndex=0;
fnSchema=fn;
this.Text="XML Database Editor - "+fnSchema;
}
}
在获得有效的 XML 文件名之后(在我测试的范围内!),此代码将文件加载到 DataSet
中,这是 DataSet
的内置函数。然后通过迭代数据集的表,使用表名填充表 ListBox
lbTables
。第一个表被选择为默认表,并且应用程序标题被更新。
将数据集保存为 XML 文件
dataSet.WriteXml(fn, XmlWriteMode.WriteSchema);
该语句写入所有表的所有数据,并且使用 XmlWriteMode.WriteSchema
选项,还写入 DataSet
的模式。 因此,XML 文件具有数据库及其所有数据的完整描述。
添加表
如下所述,将表添加到 DataSet
private void btnAddTable_Click(object sender, System.EventArgs e)
{
string tblName=edTableName.Text;
if (!ValidateTableName(tblName))
{
return;
}
DataTable dt=new DataTable(tblName);
currentTable=dt;
lbTables.Items.Add(tblName);
dataSet.Tables.Add(dt);
lbTables.SelectedItem=lbTables.Items[lbTables.FindStringExact(tblName)];
}
此代码将一个表添加到 ListBox
和 DataSet
,然后在 ListBox
中选择新添加的表。
添加列
将列添加到当前选定的表
private void btnAddColumn_Click(object sender, System.EventArgs e)
{
string colName=edColumnName.Text;
string colType=cbColumnType.Text;
if ( (!ValidateColumnNameAndType(colName, colType)) ||
(!ValidateSelectedTable()) )
{
return;
}
ListViewItem lvi=lvColumns.Items.Add(colName);
lvi.SubItems.Add(colType);
currentTable.Columns.Add(colName, Type.GetType("System."+colType));
}
在上面的代码中,将列添加到列 ListView
和选定的表。 观察代码
currentTable.Columns.Add(colName, Type.GetType("System."+colType));
添加列时,需要列名和类型。 类型是通过使用一个很棒的 VS.NET 函数 GetType
确定的,该函数将字符串的文本表示形式转换为其实际类型。 在代码中,字符串“System.”被添加到列类型字符串的前面,以便转换例程可以找到正确的类型。当在 ListView
中使用字符串 Split
函数显示列类型时,会删除“System.”,如下所述。
显示表的列
void ShowColumns()
{
lvColumns.Items.Clear();
if (currentTable != null)
{
foreach (DataColumn dc in currentTable.Columns)
{
ListViewItem lvi=lvColumns.Items.Add(dc.ColumnName);
string s=dc.DataType.ToString();
s=s.Split(new Char[] {'.'})[1];
lvi.SubItems.Add(s);
}
}
}
此代码迭代当前表的列,提取列名和列数据类型,然后将此信息添加到 ListView
。
数据网格
可能最有趣的过程是设置 DataGrid
。 DataGrid
显示所选表的数据
private void lbTables_SelectedIndexChanged(object sender,
System.EventArgs e)
{
string tblName=lbTables.Text;
currentTable=dataSet.Tables[tblName];
ShowColumns();
dgData.SetDataBinding(dataSet, tblName);
dgData.CaptionText="Table: "+tblName;
}
SetDataBinding
函数用于建立 DataGrid
和 DataSet
中特定表之间的连接。 很好的是,每当您更改表或列的名称,或添加/删除列时,DataSet
会自动更新。 无需任何代码即可更新 DataGrid
。 太棒了!
可能的 VS.NET 错误?
我注意到的一件事是,当从 DataSet
中删除一个表时,该表仍然“徘徊”在 DataGrid
中。 如果您将具有相同名称的表添加回系统中,您会注意到它已经在 DataGrid
中定义了列。 非常奇怪的行为!
结论
这是一个非常简单的实用程序,可以放在一起并演示 VS.NET 的一些优点和一些怪癖。 例如,您不能在列包含数据后更改其数据类型。 我想该程序可以扩展到手动执行此操作。 但就目前而言,我也不允许这样做(这太糟糕了,因为我偶尔需要更改现有数据的数据类型)。