将数据适配器的结果填充到我自己的数据集中?

时间:2012-10-25 16:07:51

标签: c# dataset

在开始我的问题之前我需要提一下我是c ++程序员而不是c#,所以也许我的代码语法似乎错了。我很业余,需要改进!;)

我有一个关于使用数据适配器输出结果的问题(可能是一个想法而不是问题)。 让我们来看看这些行:

public DataSet CollectData()
{
    DataSet result = new DataSet();
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("dbo.StoredProc1", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        IDataAdapter adapter = new SqlDataAdapter(cmd);

        adapter.Fill(result);/// filling a dataset

        return result;
    }
}

如您所见,此函数填充数据集并将其返回。 在我想要使用这个对象的任何地方,我应该像这样循环:

    DataSet dataSet = DataObj.CollectData(); /// above function!

    string token;
    string lemma;
    foreach (DataRow row in dataSet.Tables[0].Rows)
    {
        token = ((string)row["Token"]);
        lemma = ((string)row["Lemma"]);
        ...

        //// TODO: ex. write to file 
    }

但是,我有一个类,它演示了这个存储的对象。

这样的课程:

public class Lexeme
{
private int tokenId = -1;
private string token;
private string lemma;
/// some get and set functions!
}

如你所见,这个类包含一个对象(它类似于数据库表中存储对象的包装器)

所以我想知道是否有返回此对象的列表(Lexeme在这里)而不是数据集?我的意思是有效的内存使用。因为我处理大量数据。

例如:

public MYDATASET CollectData()
{
    MYDATASET result = new MYDATASET ();
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("dbo.StoredProc1", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        IDataAdapter adapter = new SqlDataAdapter(cmd);

        adapter.Fill(result);/// filling a dataset

        return result;
    }
}

数据集可以继承吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Typed Dataset代替您自己的对象。这使您可以轻松填充数据集,但也可以使用强类型列,并且可以在一行中轻松访问每个属性。转到Visual Studio的Add New Item窗口并添加数据集。使用设计器添加新表,并添加从sql查询返回的列。转到每列的属性窗口并指定类型(int,string等)。

从那里,当您加载数据集时,创建数据集类型的新对象,并像以前一样填充它:

public MyTypedDataset GetMyDataSet()
{
    MyTypedDataset ds = new MyTypedDataset();
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("dbo.StoredProc1", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        IDataAdapter adapter = new SqlDataAdapter(cmd);

        adapter.Fill(ds.Table1);

        return result;
    }
}

使用类型化数据集,您在设计器中创建的每个表项都有一个属性。 (默认情况下,我认为它名为Table1?)

现在,在访问您的数据时,您可以

MyTypedDataset ds = GetMyDataSet();
string myToken = ds.Table1.Rows[0].Token;
string myLemma = ds.Table1.Rows[0].Lemma;

或者在foreach中:

MyTypedDataset ds = GetMyDataSet();
foreach(var row in ds.Table1)
{
    string myToken = row.Token;
    string myLemma = row.Lemma;
}

这不如获取对象列表那么好,但它几乎就在那里。如果你想要一个你自己的对象列表,你很可能需要使用Object Relational Mapper,例如Entity Framework或NHibernate。