sqlite3 внутри C ++ (хранимая процедура или сложный sql с TABLE и его INDEX) - PullRequest
0 голосов
/ 02 октября 2011

Я пытаюсь использовать sqlite3 в своем приложении C ++.Я сделал:

  • sqlite3 my.db
  • sqlite> СОЗДАТЬ ТАБЛИЦУ ссылок (UrlAsID VARCHAR (255) PRIMARY KEY, Владелец VARCHAR (255), ......,CreationTime INTEGER);
  • sqlite> CREATE INDEX linkIDs ON links (UrlAsID, CreationTime ASC);

Затем я открыл соединение из кода C ++ с базой данных.

Изнутри кода у меня есть объект Url.Теперь мне нужно сделать следующее:

// check if url is in index (and in table as well)
string urlID = sqlite3_exec("SELECT UrlAsID FROM linkIDs WHERE UrlAsID = " + Url.id + ";");
if (urlID.empty()) {
    sqlite3_exec("INSERT INTO links VALUES (" + Url.properties + ");");
    sqlite3_exec("INSERT INTO linkIDs VALUES (" + Url.id + "," + int(Url.creationTime) + ");");
} else {
    sqlite3_exec("UPDATE links SET (CreationTime = " + int(Url.creationTime) + "," + ... + ") WHERE UrlAsID = " + Url.id + ";");
    sqlite3_exec("UPDATE linkIDs SET (CreationTime = " + int(Url.creationTime) + ") WHERE UrlAsID = " + Url.id + ";");
}

Я думал создать хранимую процедуру или использовать сложный оператор SQL для инкапсуляции вышеуказанной логики.Не могли бы вы предоставить мне более точный код для этого.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 02 октября 2011

Ваши заявления должны быть завернуты в транзакцию как для безопасности, так и для скорости. Кроме того, вы должны использовать подготовленные операторы с параметрами , опять-таки как для безопасности, так и для скорости (разного рода безопасность, но даже в этом случае). И вы должны использовать INSERT ИЛИ ЗАМЕНИТЬ подходящим COALESCE . Все это независимо от того, в какой язык вы встраиваете, но ссылки на соответствующий синтаксис.

1 голос
/ 02 октября 2011

SQLite не поддерживает хранимые процедуры: http://www.sqlite.org/whentouse.html

Если код SQL сложный, я бы попытался поместить его в файл .sql, затем загрузить в переменную и выполнить.

0 голосов
/ 02 октября 2011

SQLite не поддерживает хранимые процедуры.Максимум, что вы можете сделать, это использовать подготовленные заявления.Вам также следует использовать методы привязки SQLite для установки параметров вместо конкатенации строк.Прочитайте введение здесь: http://sqlite.org/cintro.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...