创建新的类型化DataSet对象(c#)

时间:2010-09-18 05:16:47

标签: c# datagrid dataset xsd

我使用DataGrid来显示xml文件。 Grid的DataSource是一个Typed DataSet。(使用模式)

    Assembly assembly = Assembly.GetExecutingAssembly();
    Stream stream = assembly.GetManifestResourceStream("XML_Reader.Resources.schema.xsd");
    XmlSchemaSet schemas = new XmlSchemaSet();
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas.Add(null, XmlReader.Create(stream));
    using (XmlReader reader = XmlReader.Create(xmlFile, settings))
    {
        newDataSet.ReadXml(reader);
    }
    dataGrid.DataSource = newDataSet;


我在项目中添加了一个xsd架构,并使用MSDataSetGenerator生成newDataSet。 (VS2008)。
现在我想为我读取的每个新的(分层xml )文件创建一个新的DataSet对象。

创建一个新的DataSet对象isn'问题,但数据类型不正确,所以我不能很好地排序(特别是数字字段)。在我看来,我需要创建一个新的 类型化数据集

那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

Datasets in Visual Studio Overview -

键入与无类型数据集

类型化数据集是首先从基础DataSet类派生的数据集,然后使用存储在.xsd文件中的数据集设计器中的信息来生成新的强类型数据集类。生成来自模式(表,列等)的信息,并将其作为一组第一类对象和属性编译到此新数据集类中。因为类型化数据集继承自基础DataSet类,所以类型化类假定DataSet类的所有功能,并且可以与将DataSet类的实例作为参数的方法一起使用。
相比之下,无类型数据集没有相应的内置模式。与在类型化数据集中一样,无类型数据集包含表,列等 - 但这些数据集仅作为集合公开。 (但是,在无类型数据集中手动创建表和其他数据元素后,可以使用数据集的WriteXmlSchema方法将数据集的结构导出为模式。)

是的,您可以使用Visual Studio自动生成这些:

或者,您可以创建自己的强类型DataSet (这是更清洁的IMO)。例如:

using System.Data;

public class CatsDataTable : DataTable
{
  public CatsDataTable() : base()
  {
    base.TableName = "cats";
    Columns.Add(new DataColumn(SqlTokens.id_cats, typeof(int)));
    Columns.Add(new DataColumn(SqlTokens.owners_id_owners, typeof(int)));
    Columns.Add(new DataColumn(SqlTokens.cats_name, typeof(string)));
    Columns.Add(new DataColumn(SqlTokens.cats_number_of_spots, typeof(int)));
  }
}

public class OwnersDataTable : DataTable
{
  public OwnersDataTable() : base()
  {
    base.TableName = "owners";
    Columns.Add(new DataColumn(SqlTokens.id_owners, typeof(int)));
    Columns.Add(new DataColumn(SqlTokens.owners_name, typeof(string)));
  }
}

public class PetsDataSet : DataSet
{
  public PetsDataSet() : base()
  {
    base.TableName = "pets";
    Tables.Add("cats");
    Tables.Add("owners");
  }
}

关于垃圾收集的切线

垃圾收集(GC)是一种自动内存管理。这是资源管理的一个特例,其中管理的有限资源是内存。垃圾收集器或仅收集器尝试回收垃圾或由程序不再使用的对象占用的内存。 (维基百科)

答案 1 :(得分:-1)

让我回答我自己的问题; - ))

类型化DataSet只是一个可以像任何其他类一样实例化的类。对于工具生成的任何东西都没有魔力,这些工具只是生成类,你可以像使用其他类一样使用这些类。

NewDataSet d1 = new NewDataSet();在那里放置正确的类名而不是“NewDataSet”。