0

在开始我的问题之前,我需要提到我是 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;
    }
}

数据集可以继承吗?

4

1 回答 1

1

您可以使用 aTyped Dataset而不是您自己的对象。这使您可以轻松地填充数据集,而且还具有强类型列,并且能够轻松地访问一行中的每个属性。转到Add New ItemVisual Studio 的窗口并添加一个数据集。使用设计器添加一个新表,并添加从您的 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 MapperEntity Framework 或 NHibernate 等。

于 2012-10-25T17:05:44.260 回答