Я новичек в программировании средствами Qt да еще и с использованием SQLite. Прошу сильно не критиковать.
Проблема такова.
Существует главная БД, и N - количество дополнительных БД. В главной БД содержатся имена дополнительных БД. Делаю запрос по выбраному имени из главной БД и присваиваю имя переменной. Закрываю свою главную БД. И осуществляю соединение с БД имя которой содержится в переменной. Получаю.
QSqlQuery::exec: database not open
Я напливал на это оповещение и решил продолжить. Пытаюсь добавить в нее запись (ничего не происходит). Начинаю добавлять запись в Главную БД (соединение с которой разрывал) оно добавляет без проблем. (имена баз все разные) ОБЪЯСНИТЕ НОВИЧКУ. Спасибо!
Код приведи закрытия подключения и открытия нового.
private:
class QListWidget* list;
class QString namelist;
class QString namedb;
class QSqlDatabase db;
private slots:
void listClicked();
/***************************/
//Добавляю имена из главной БД
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("masterdb");
db.setHostName();
db.setUserName("1");
db.setPassword("1");
if (!db.open()){
db.lastError().text();
}
QSqlQueryModel model;
model.setQuery("SELECT name FROM table");
for (int i = 0; i < model.rowCount(); ++i) {
namelist = model.record(i).value("name").toString();
list->addItem(namelist);
}
/******************************/
void Action::listClicked()
{
namedb=list->currentItem()->text();
db.close();
db.removeDatabase("QSQLITE");
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(namedb.toUtf8());
db.setHostName();
db.setUserName("1");
db.setPassword("1");
if (!db.open()){
db.lastError().text();
}
Не храни db, ты всегда можешь его получить. Вот так примерно должно быть:
void Action::listClicked()
{
const QString& namedb = list->currentItem()->text();
QSqlDatabase db = QSqlDatabase::database ();
db.close();
db.setDatabaseName(namedb);
db.setHostName();
db.setUserName("1");
db.setPassword("1");
if (!db.open()){
db.lastError().text();
}
В этой строке же нужно указать какой тип БД я хочу использовать?
QSqlDatabase db = QSqlDatabase::database ();
db.setUserName("1");
db.setPassword("1");
db.open("1", "1");
SQLite не поддерживает пароли.
QSqlDatabase::database () - указатель на дефолтное подключение. Т.е. когда ты делаешь addDatabase создается соединение, к которому ты из любого участка программы сможешь получить доступ через QSqlDatabase::database (). Так же можешь задать имя соединению:
...................
QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE", "YOUR_CONNECTION);
.............................................
QSqlDatabase db = QSqlDatabase::database ("YOUR_CONNECTION);
...................
QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE", "YOUR_CONNECTION);
.............................................
QSqlDatabase db = QSqlDatabase::database ("YOUR_CONNECTION);
Значит что-то ее держит. Модель какая-нибудь.
Попробуй метод clear ().
Ничего не помогает. Может кто то знает еще какие либо варианты почему не получается?
Привьём пожалуй любовь к QtSql =))
Сделай вот так:
void Action::listClicked()
{
QString namedb = list->currentItem()->text();
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE",namedb);
db.setDatabaseName(namedb);
if (!db.open()) {
qDebug() << db.lastError().text();
db.close();
return 0;
}
}
bool getDBlist()
{
{ // не спроста тут мы взяли всё это в скобки
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","masterdb");
db.setDatabaseName("masterdb");
if (!db.open()) {
qDebug() << db.lastError().text();
db.close();
return 0;
}
}
// сейчас база данных открыта, но переменная db удалена
QSqlQuery q(QSqlDatabase::database("masterdb")); // вот так можно обратиться к открытому соединению
if (!q.exec("SELECT name FROM table;")) return 0;
while (q.next()) list->addItem(q.value(0).toString());
// суть в том, чтобы сейчас не было НИ ОДНОЙ живой переменной указывающей на db
if (QSqlDatabase::contains("masterdb")) { // masterdb - это имя подключения к бд. такое же как и то, которое мы указали при создании соединения
if (QSqlDatabase::database("masterdb").isOpen()) QSqlDatabase::database("masterdb").close();
QSqlDatabase::removeDatabase("masterdb");
}
return 1;
}
Проблема вот такого плана
существует виджет QLineEdit
создаю БД по обращению к функции
bool maindbCreate()
{
QSqlDatabase maindbCreate = QSqlDatabase::addDatabase("QSQLITE");
maindbCreate.setDatabaseName("base.db");
maindbCreate.setHostName("localhost");
maindbCreate.setUserName("user");
maindbCreate.setPassword("password");
if(!maindbCreate.open()){
maindbCreate.lastError().text();
QSqlDatabase::removeDatabase("QSQLITE");
}else{
maindbCreate.close();
QSqlDatabase::removeDatabase("QSQLITE");
return false;
};
return true;
}
bool maindbCreateTable()
{
QSqlDatabase maindbCreateTable = QSqlDatabase::addDatabase("QSQLITE");
maindbCreateTable.setHostName("localhost");
maindbCreateTable.setDatabaseName("base.db");
if(!maindbCreateTable.open("user", "password")){
maindbCreateTable.lastError().text();
QSqlDatabase::removeDatabase("QSQLITE");
}else{
QSqlQuery queryMaindbCreateTable;
queryMaindbCreateTable.exec("CREATE TABLE user (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(20));");
queryMaindbCreateTable.clear();
maindbCreateTable.close();
QSqlDatabase::removeDatabase("QSQLITE");
return false;
};
return true;
}
bool maindbInsert()
{
QSqlDatabase maindbInsert = QSqlDatabase::addDatabase("QSQLITE");
maindbInsert.setHostName("localhost");
maindbInsert.setDatabaseName("base.db");
if(!maindbInsert.open("user", "password")){
maindbInsert.lastError().text();
QSqlDatabase::removeDatabase("QSQLITE");
}else{
QSqlQuery queryMaindbInsert;
queryMaindbInsert.exec("INSERT INTO (name) VALUES ('"+editCreateName->text()+"');");
queryMaindbInsert.clear();
maindbInsert.close();
QSqlDatabase::removeDatabase("QSQLITE");
return false;
};
return true;
}
наверное, не зря ругается, и так оно и есть Попробуй
ui->editCreateName->text()
void maindbCreate();
void maindbCreateTable();
QSqlTableModel model;
model.setTable("coming");
model.select();
model.removeRow(view->currentIndex().row());
Dimix, если честно вообще ничего в твоём примере не понял.. советую перечитать его (код) ещё раз самому и попытаться представить логику. что и как делается. очень много противоречий и ненужных действий..
Почему не соотвецтвует вопросу . Я же не говорил для чего мне нужно узнать выделенную строку. А по коду вроде ясно что view это аргумент QTableView.
view->currentIndex().row()
1) склайту не нужно указывать HostName, UserName и Password
2) в чём суть функции maindbCreate()? по сути она вообще ничего не делает
3) maindbCreate.lastError().text() в maindbCreate() это вообщем то возвращаемая переменная. в твоём примере не используется.
4) не правильно:
queryMaindbInsert.exec("INSERT INTO (name) VALUES ('"+editCreateName->text()+"');");
queryMaindbInsert.prepare("INSERT INTO (name) VALUES (?);");
queryMaindbInsert.addBindValue(ui->editCreateName->text());
if (!queryMaindbInsert.exec()) {qDebug() << queryMaindbInsert.lastError().text(); return;}
CREATE TABLE user (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(20));
id INTEGER PRIMARY KEY AUTOINCREMENT
QString ddBegin, mmBegin, yyBegin, ddEnd, mmEnd, yyEnd;
ddBegin="01";mmBegin="02";yyBegin="2010";
ddEnd="01";mmEnd="06";yyEnd="2010";
QSqlQueryModel* model = new QSqlQueryModel;
model->setQuery("SELECT * FROM coming WHERE date >='"+ddBegin+", "+mmBegin+", "+yyBegin+"'and date <='"+ddEnd+", "+mmEnd+", "+yyEnd+"';");
Dimix, почитай доки про склайт. совершенно безопасно сохранять постоянное подключение к бд. мало того, база данных умеет работать и с несколькими пользователями одновременно.
это тебе не xml-ки.
кроме того, что то мне подсказывает что создание множества баз данных в твоём случае тоже не обосновано.
вот напимер. в моём проекте всего одна база склайта, причём, подключаюсь я к одному и тому же файлу двумя коннектами в разных потоках. тоесть, можно сказать, два пользователя, которые постоянно пишут и читают. размер базы планируется сотни м.б. более десяти таблиц. и всё отлично работает!
советую пересмотреть концепцию)
Возникла проблема такого характера. Нужно изменить запись в базе данных. Пример.
ID | NAME | LOOK
1 | TOM | 1
2 | JON | 0
Поле LOOK это типо просматривался пользователь или нет
Мне нужно чтоб когда я посмотрю пользователя JON его LOOK стал 1
Я думал просто забирать все данные и записывать их по новому а удалять типо по ID но если я удалю TOM то ID JON останется всеравно 2.
Помогите!
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)