2009-06-07 19 views
10

私はMicrosoft Visual C#2008 ExpressとSQLiteで作業しています。C#でSQLiteリーダーで返される行の数を数えますか?

私はこのようなもので、私のデータベースを照会しています:

SQLiteCommand cmd = new SQLiteCommand(conn); 

cmd.CommandText = "select id from myTable where word = '" + word + "';"; 
cmd.CommandType = CommandType.Text; 
SQLiteDataReader reader = cmd.ExecuteReader(); 

それから私はこのような何か:私は何をしたいか

if (reader.HasRows == true) { 
    while (reader.Read()) { 
     // I do stuff here 
    } 
} 

を前に行の数をカウントしています私は "reader.Read()"を返します。なぜなら、返される数値は、私がしたい/したいことに影響するからです。私はwhileステートメント内でカウントを追加することができますが、実際にはカウントを知る必要があります。

提案がありますか?

答えて

23

DataReaderは遅れて実行されるため、開始する前に行セット全体を取得しません。

  1. を反復処理し、SQL文の中で
  2. カウントを数える:これは二つの選択肢が残ります。

    cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; 
    cmd.CommandType = CommandType.Text; 
    int RowCount = 0; 
    
    RowCount = Convert.ToInt32(cmd.ExecuteScalar()); 
    
    cmd.CommandText = "select id from myTable where word = '" + word + "';"; 
    SQLiteDataReader reader = cmd.ExecuteReader(); 
    
    //... 
    

    注私は初めに*、いないIDをカウントする方法:私はSQLの男のより多くのだから

は、私は、SQLステートメントのカウントを行います。 count(id)はidを無視し、count(*)は完全にnullの行だけを無視するためです。ヌルIDがない場合は、count(id)を使用します(テーブルサイズに応じて少し速くなります)。

更新:ExecuteScalarに変更され、コメントに基づいてcount(id)に変更されました。あなたが要求する何

+0

ええ - あなたの応答とJeremy'sの間に、これはうまくいくでしょう。最終的に "myTable"は非常に大きくなりますが、返される行の数は常に小さくなる可能性があります。つまり、10より小さく、たいていは0-2になることが多いです。ありがとう! – adeena

+3

oh - と "id"は決してnullになりません。そうであれば、他の何かが間違っています。 :) – adeena

+0

どのくらいの大きさが "非常に大きい"、そして、あなたはSQLiteがそのために最高のものだと確信していますか? – Eric

2

は、2番目のクエリを実行します

 
cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; 
cmd.CommandType = CommandType.Text; 
SQLiteDataReader reader = cmd.ExecuteReader(); 

読者は、結果セット内の行の数を含むつの列と単一の行を含むことになります。カウントはサーバー上で実行されているので、すばやくすべきです。

+0

数えるときは気をつけてください。単一フィールド:nullの場合はカウントされませんが、返されます。カウントで使用する前に、フィールドにNOT NULL制約があることを確認してください。 – Eric

+4

カウントでは、むしろExecuteReaderよりExecuteScalarを使用する必要があります。 –

+0

絶対に。一般に、私は "id"と呼ばれるフィールドがNULLではないことを願っていますが、決して確信が持てません! –

1

データベースからid列のみをロードする場合は、List<string>にロードしてそこからメモリで作業する方が簡単でしょうか?

+0

テーブルに数十万行ある状況を考えると、これはおそらくあなたがしたいことではありません。前もって別のクエリを実行して、行セットのカウントを見つける方がよい。 –

+0

それは「私がここで行うこと」が何であるかによって決まります...アルゴリズムによっては、ほとんどの/すべてのデータがメモリに残ってしまうことがあります。 – jerryjvl

+0

また、別のコメントでは、提出者は通常、10行のようなものがクエリから期待されることを示しているので、リストの使用はおそらくデータベースへの2回のラウンドトリップよりも速いでしょう。 – jerryjvl

2

は現実的ではありません - 、私の重点をIgor Tandetnikを引用する:

SQLiteのは、リクエストに応じて、記録にあなたがsqlite3_stepを呼び出すたびに1つずつ生成します。 がいくつあるのか分かりませんが、一部になるまではsqlite3_step となっています。

sqlite3_stepは、SQLiteのC APIの関数で、結果の各行に対してC#インターフェイスがここで呼び出す関数です)。

あなたはむしろ何ができる"SELECT COUNT(*) from myTable where word = '" + word + "';"まず、あなたの「本当の」クエリの前に - ことは、あなたが本当のクエリから取得するつもりだどのように多くの行を教えてくれます。

0

が、私は実際にそれがあるのはなぜ

前に数を知っておく必要がありますか?適切なメモリ内データ構造(Dataset、List ...)を使用する場合、これは通常必要ありません。おそらく、行を事前に数える必要のないことをやり遂げる方法があります。

+0

私はここに定義された "graphmaster"のバージョンを実装しようとしています:http://www.alicebot.org/documentation/matching.html基本的に - 0または1行がある場合、私はユニークな答えと心配がありません。しかし、2つ以上の行がある場合は、どれが正解かを判断するために他の何かをする必要があります...そして、それは私の "グラフ"の次のノードに依存します。それは私がコメントでくくっていくことができるほど最高です! :) – adeena

+0

リストまたはデータセット内のすべての行を取得し、行数を確認して、行内の数に応じてメモリ内のデータに対して必要な処理を実行できます。クエリが数百または数千の行をフェッチする可能性がある場合を除き、問題ではありません。 –

0

通常、私はできるだけ速く結果を得るために

select count(1) from myTable where word = '" + word + "';"; 

を行うだろう。 idがintの場合、大きな違いはありません。文字列型のように少し大きかったら、大きなデータセットとの違いに気付くでしょう。

それについての推論(1)にはヌル行が含まれます。しかし、私はそれについて間違っている場合、私は訂正する用意ができています。

0

あなたはこのアプリケーションが遅くなりますselect count... from...

でカウントする必要があります。しかし、あなたのアプリをより速くするための簡単な方法があり、そのようにパラメータ化されたクエリを使用しています。

はこちらをご覧ください:How do I get around the "'" problem in sqlite and c#?

(。だから、スピードのほかに、パラメータ化クエリは、あまりにも2つの他の利点を持っている)

0

SQLiteCommand cmd = new SQLiteCommand(conn); 

cmd.CommandText = "select id from myTable where word = '" + word + "';"; 

SQLiteDataReader reader = cmd.ExecuteReader(); 

while (reader.HasRows) 

    reader.Read(); 

int total_rows_in_resultset = reader.StepCount; 

total_rows_in_resultsetを処理した後、あなたに結果セットの行数を与え、これを試してみてくださいクエリ

同じリーダーを使いたい場合は、このリーダーを閉じてもう一度やり直してください。確かに

0
SQLiteCommand cmd = new SQLiteCommand(conn); 
cmd.CommandText = "select id from myTable where word = '" + word + "';"; 
SQLiteDataReader reader = cmd.ExecuteReader(); 

while (reader.Read()) 
     { 
      total_rows_in_resultset++; 
     } 
+2

このコードがOPに役立つ理由の説明を追加してください。これにより、今後の視聴者からの回答が得られます。詳細については、[回答]を参照してください。これは、このような古い質問に答えるときに、他の多くの既存の回答とあなたの答えを区別するために特に重要です。 –

0

このようなものになるだろう行数を取得するためのより良い方法: -

SQLiteDataReader reader = SendReturnSQLCommand(dbConnection, "SELECT COUNT(*) AS rec_count FROM table WHERE field = 'some_value';"); 
     if (reader.HasRows) { 
     reader.Read(); 
     int count = Convert.ToInt32(reader["rec_count"].ToString()); 

... 

    } 

あなたが行を反復処理する必要はありませんその方法

関連する問題