2013-03-28 12 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

Вы можете добавить условие «где не существует ...» в инструкцию insert. – 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

Фантастический ответ на вопрос ОП. Мой поиск закончен. –

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

Спасибо Тим. Первоначально моя цель состояла в том, чтобы проверить, существует ли запись в таблице, а затем извлечь последний rowid, иначе добавить запись в таблицу и извлечь последний rowid. Почему вы используете (1) в sql-запросе insead of (*)? –

+0

'... иначе добавить запись в таблицу и извлечь последнюю строку. Ваш код выше не извлекал последний rowid, если слово еще не существовало. Таким образом, вы хотели бы «вставить ... где не существует», а потом вывести rowid. Зачем выбирать 1 вместо select *? Выбирать col или Select 1 немного более эффективно, чем выбор каждого столбца, и вам не нужно больше одного столбца при тестировании на существование. Если бы у вас было много столбцов, скажем, и выполняли тест на существование в цикле, это незначительное повышение эффективности могло бы довести до «реальных денег», так сказать. – Tim

Смежные вопросы