65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (45投票s)

2002年9月30日

CPOL

3分钟阅读

viewsIcon

219480

downloadIcon

5169

查看和编辑您的 XML 数据库架构和数据。

Sample Image - xmlSchemaEditor.jpg

引言

在我发表了关于 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)];
}

此代码将一个表添加到 ListBoxDataSet,然后在 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

数据网格

可能最有趣的过程是设置 DataGridDataGrid 显示所选表的数据

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 函数用于建立 DataGridDataSet 中特定表之间的连接。 很好的是,每当您更改表或列的名称,或添加/删除列时,DataSet 会自动更新。 无需任何代码即可更新 DataGrid。 太棒了!

可能的 VS.NET 错误?

我注意到的一件事是,当从 DataSet 中删除一个表时,该表仍然“徘徊”在 DataGrid 中。 如果您将具有相同名称的表添加回系统中,您会注意到它已经在 DataGrid 中定义了列。 非常奇怪的行为!

结论

这是一个非常简单的实用程序,可以放在一起并演示 VS.NET 的一些优点和一些怪癖。 例如,您不能在列包含数据后更改其数据类型。 我想该程序可以扩展到手动执行此操作。 但就目前而言,我也不允许这样做(这太糟糕了,因为我偶尔需要更改现有数据的数据类型)。

© . All rights reserved.