2013-03-28 49 views
6

我試圖檢查一個表中的記錄是否已經存在。檢查Sqlite + C中是否存在記錄#

我該怎麼做?

我已經寫了下面的代碼:

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

您可以在插入語句中添加「where not exist ....」條件。 – Tim

+0

'如果這個sql請求返回false ...然後在表中添加記錄'您的目標是防止重複,只有在不存在的情況下才插入該詞,對吧? – Tim

回答

11

要檢查是否該記錄存在,你可以簡化你的代碼

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將返回您的查詢返回的第一行的第一列。
(該鏈接是SqlServer的,但它是SQLite的是相同的,因爲SQLiteCommand應該實現IDbCommand接口)

+0

OP的問題的夢幻般的答案。我的搜索結束了。 –

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

謝謝蒂姆。我最初的目標是檢查表中是否存在記錄,然後提取最後一個rowid,否則在表中添加一條記錄並提取最後一個rowid。爲什麼在(*)的sql請求中使用(1)? –

+0

'...否則在表格中添加記錄並提取最後一個rowid'。如果該單詞尚不存在,則上面的代碼不會提取最後一個rowid。所以你會想'插入...不存在'的地方,然後提取rowid。爲什麼選擇1而不是選擇*?選擇列或選擇1比選擇每列的效率更高,並且在測試存在時不需要多個列。如果你有很多專欄,說,並且正在循環中執行存在的測試,那麼效率的邊際改進就可以歸結爲「真錢」。 – Tim