2013-03-28 9 views
6

テーブルのレコードが既に存在するかどうかを確認しようとしています。レコードがSqlite + Cに存在するかどうかを調べる#

どうすればいいですか?

私はすでに次のコードを書いた

:そのレコードはあなたが

cmd.CommandText = "SELECT count(*) FROM wordlist WHERE word='word'"; 
int count = Convert.ToInt32(cmd.ExecuteScalar()); 
if(count == 0) 
{ 
    cmd.CommandText = "INSERT INTO wordlist(word) VALUES ('word')"; 
    cmd.ExecuteNonQuery(); 
} 

ExecuteScalarあなたのコードを簡素化することができ存在するかどうかを確認するには

string dbName = "Data Source=searchindex.db"; 
SQLiteConnection con = new SQLiteConnection(dbName); 
con.Open(); 
SQLiteCommand cmd = new SQLiteCommand(con); 

// If this sql request return false 
cmd.CommandText = "SELECT rowid FROM wordlist WHERE word='word'"; 
cmd.ExecuteNonQuery(); 

// then add record in table 
cmd.CommandText = "INSERT INTO wordlist(word) VALUES ('word')"; 
+0

私はあなたがここで求めているかを把握することはできません! – Mido

+0

insertステートメントに "where not exists ...."条件を追加できます。 – Tim

+0

'このsqlリクエストがfalseを返した場合は、テーブルにレコードを追加します。あなたの目標は重複を防止し、存在しない場合にのみ単語を挿入することです。 – Tim

答えて

11

をクエリによって返された最初の行の最初の列を返します。 。
(リンクはのSQLServerのためですが、SQLiteCommandはIDbCommandインタフェースを実装する必要がありますので、それは、SQLiteのために同じである)

+0

OPの質問に対する素晴らしい答え。私の検索は終わった。 –

0
 insert into wordlist(word) 
     select 'foo' 
     where not exists (select 1 from wordlist where word = 'foo') 
+0

Timありがとうございます。私の目標は、テーブルにレコードが存在するかどうかをチェックし、最後のROWIDを抽出し、それ以外の場合はテーブルにレコードを追加して最後のROWIDを抽出することでした。なぜ(*)のSQLリクエストで(1)を使用するのですか? –

+0

'...それ以外の場合は、テーブルにレコードを追加し、最後のROWIDを抽出します。上記のコードは、単語がまだ存在しない場合は最後のROWIDを抽出していませんでした。だからあなたは '挿入しない...存在しない'とし、その後にROWIDを抽出したいと思うだろう。 select *の代わりに1を選択するのはなぜですか? Select colまたはSelect 1は、すべての列を選択するよりもわずかに効率的です。存在をテストするときは、複数の列は必要ありません。多くの列を持っていて、ループ内に存在するためのテストを実行していた場合、効率のわずかな向上は「リアルマネー」になる可能性があります。 – Tim

関連する問題