2017-06-28 26 views
0

Visual Studio上にSQLを含むコンソールアプリケーションを構築しています。基本的には、大量のカラムを持つデータベーステーブルがあり、変数として設定し、それらを効率的に扱う方法が必要です。今私はループすることができる配列を考えています。ここに私のコードは今どのように見えるかの並べ替えです:c#変数宣言

SqlCommand getColumns = new SqlCommand("SELECT * FROM tableName", 
connection1); 

myReader = getColumns.ExecuteReader(); 
while (myReader.Read()) 
{ 
    string[] array = new string { myReader["ColumnName"].ToString(), 
    myReader["ColumnName2"].ToString, etc...}; 

    for (int i = 0; i <= array.length; i++) { 
     some action...array[i]; 
    } 
} 

私はこれを行うには、より効率的な方法があるのなら、私に知らせたり、私が必要な場合は、私はC#と開発のこの種のやや新たなんだ認めますより多くのコードを投稿してください。ありがとう!

+2

DataTableという名前のクラスがあります。それは行と列で輝かしい配列です。簡単にDataReaderから1つを入力するhttps://msdn.microsoft.com/en-us/library/7x8ccbsb(v=vs.110).aspx – Steve

+3

あなたが求めていることは本当にわかりません。配列を使用してデータベースから読み込むべきかどうかを尋ねるだけですか?私はあなたが*できたと思う、あなたを止めるものは何もない。それは多くの点で問題になる可能性があります。なぜデータのレコードを表すクラスを作成しないのですか?適切な型、必要なデータ検証、実行される操作などを含みます。その後、 'while'ループでは、各レコードからそのクラスのインスタンスを作成し、それらを全体の配列に追加します(または' List ' )そのクラスの? – David

+0

期待している行の数はいくつですか? –

答えて

3

あなたは列の多くを持っている場合は、インデックスの代わりに、名前によってそれらにアクセスすると、より効率的になります:

string[] array = new string[myReader.FieldCount]; 
for(int i=0; i<myReader.FieldCount; i++) 
{ 
    array[i] = myReader[i].ToString(); 
} 

また、あなたは(通常の場合)、事前の列の数を知っていれば、 while(myReader.Read())から配列宣言を移動すると、同じ配列を再利用するためにメモリ割り当てが少なくなります。

もう一つの提案は、あなたが望むように...文字列にすべてを変換するオブジェクトの配列を宣言し、各データ型を処理する必要はないかもしれないということです。整数はおそらく、文字列配列に保存するのではなく、あるエンティティの整数プロパティに設定する必要があります。

個人的に私はいくつかの実体を宣言し、それらのリストを宣言します。 (あなたが今そうであるように)

public class MyEntity 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    //Other properties 

} 

//... 

SqlCommand getColumns = new SqlCommand("SELECT * FROM tableName", 
connection1); 

var myDataFromTable = new List<MyEntity>(); 

myReader = getColumns.ExecuteReader(); 
while (myReader.Read()) 
{ 
    myDataFromTable.Add(new MyEntity { 
      Name = myReader[0] as string, 
      Age = (int)myReader[1] 
      //... 
     }); 
} 
//Process your list of entities here 

別のアプローチは、メモリにすべてを保存しないかもしれないが、その場でプロセスデータは、 - すべてはあなたの要件とデータセットのサイズによって異なります。次に、データベースからリストを作成します。しかし、とにかく、私はデータをあるエンティティに解析し、それを使って作業することをお勧めします。私の理解あたりとして

2

- それを行う方法で。 テーブルの列のプロパティに似たプロパティを含むクラスを作成できます。 whileループでは、そのクラスのオブジェクトを作成し、そのクラスのプロパティを設定し、そのオブジェクトをArraylist(クラスオブジェクトを含むArraylist)に追加することができます。

参考リンク:https://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx

は、その情報がお役に立てば幸いです。

3

あなたは、このためのカスタム型を必要としません。 .NETはすでにDataSetDataTableを提供しています。 DataTableは1つの結果セットであるため、結果はSSMS結果ウィンドウに表示されているのとまったく同じです。

var dt = new DataTable(); 
dt.Load(myReader); 
+0

OPのデータセットのサイズを考えると、全体をメモリに取り込むことは望ましくありません。データをストリーミングして各行で一度に処理する方がはるかに好ましい方法です。 – Servy

+0

これは、セット内のデータを1つのクエリですべて検索するかどうかを設計する選択肢です。 OPはそれについて何も言及していない。問題は、それらの多くの行を保持する方法ではなく、非常に多くの列を保持する方法です。 – niksofteng

+0

はい、OPはデータをストリーミングするために*特定の*デザインを選択しました。ストリーミングするデータを処理する方法についての質問をしました。非常に大きなデータセットをメモリに完全に引き込むことで、コードが劇的に悪化します。あなたは単に「あなたがそれのように感じたので」コードを客観的に悪化させることはありません。 – Servy