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

Typed 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 Mapper、EntityFrameworkやNHibernateなどのを使用する必要があります。

于 2012-10-25T17:05:44.260 に答える