2013-03-28 21 views
6

Próbuję sprawdzić, czy rekord w tabeli już istnieje.sprawdzanie, czy rekord istnieje w Sqlite + C#

Jak mogę to zrobić?

już napisał następujący kod:

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

nie mogę dowiedzieć się, co prosisz o tutaj! – Mido

+0

Możesz dodać warunek "where not there ...." do instrukcji insert. – Tim

+0

'Jeśli to żądanie sql zwróci false ... następnie dodaj rekord w tabeli' Twoim celem jest zapobieganie duplikatom, wstawianie słowa tylko wtedy, gdy ono nie istnieje, prawda? – Tim

Odpowiedz

11

aby sprawdzić, czy ten rekord istnieje można uprościć kod

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 powróci pierwszej kolumnie pierwszego wiersza zwróconego przez zapytanie .
(Link jest dla SqlServer, ale jest identyczna dla SQLite, ponieważ SQLiteCommand powinna implementować interfejs IDbCommand)

+0

Fantastyczna odpowiedź na pytanie OP. Moje poszukiwania się skończyły. –

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

Dziękuję Tim. Moim początkowym celem było sprawdzenie, czy w tabeli istnieje zapis, a następnie wyodrębnienie ostatniego wiersza, w przeciwnym razie dodanie rekordu do tabeli i wyodrębnienie ostatniego wiersza. Dlaczego używasz (1) w zapytaniu sql bez znaku (*)? –

+0

'... w przeciwnym razie dodaj rekord w tabeli i wypakuj ostatni wierszid'. Powyższy kod nie wyodrębnił ostatniego wiersza, jeśli słowo jeszcze nie istniało. Więc chcesz "wstawić ... gdzie nie istnieje", a następnie wyodrębnić rowid. Dlaczego warto wybrać 1 zamiast wybrać *? Wybierz col lub Select 1 jest nieznacznie bardziej efektywny niż wybór każdej kolumny i nie potrzebujesz więcej niż jednej kolumny podczas testowania istnienia. Gdybyś miał wiele kolumn, powiedzmy, i wykonywał test na istnienie w pętli, ta marginalna poprawa wydajności mogłaby dodać do "prawdziwych pieniędzy", że tak powiem. – Tim

Powiązane problemy