Первый раз решил использовать базу данных. Написал по примеру:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Tests");
db.setUserName("Ivan");
db.setHostName("localhost");
db.setPassword("password");
bool b = db.open();
if(!b)
QString error = db.lastError().text();
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Tests");
db.setUserName("Ivan");
db.setHostName("localhost");
db.setPassword("password");
bool b = db.open();
if(!b)
QString error = db.lastError().text();
Почему этот код работает (отображается таблица с данными):
#include <QtGui/QApplication>
#include "sql.h"
#include <QtSql>
#include <QTableView>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("addressbook");
db.setUserName("elton");
db.setHostName("epica");
db.setPassword("password");
if (!db.open()) {
qDebug() << "Cannot open database:" << db.lastError();
return false;
}
return true;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
bool b = createConnection();
QSqlQuery query;
QString str = "CREATE TABLE addressbook ( "
"number INTEGER PRIMARY KEY NOT NULL, "
"name VARCHAR(15), "
"phone VARCHAR(12), "
"email VARCHAR(15) "
");";
query.exec(str);
QString strF =
"INSERT INTO addressbook (number, name, phone, email) "
"VALUES(%1, '%2', '%3', '%4');";
str = strF.arg("1")
.arg("Piggy")
.arg("+49 631322187")
.arg("piggy@mega.de");
query.exec(str);
str = strF.arg("2")
.arg("Kermit")
.arg("+49 631322181")
.arg("kermit@mega.de");
query.exec(str);
//////////////////////////////////////////////////////////////////////////
QTableView view;
QSqlTableModel model;
model.setTable("addressbook");
model.select();
view.setModel(&model);
view.show();
return a.exec();
}
#include "cwin.h"
cwin::cwin(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
bool b = createConnection();
QSqlQuery query;
QString str = "CREATE TABLE addressbook ( "
"number INTEGER PRIMARY KEY NOT NULL, "
"name VARCHAR(15), "
"phone VARCHAR(12), "
"email VARCHAR(15) "
");";
query.exec(str);
QString strF =
"INSERT INTO addressbook (number, name, phone, email) "
"VALUES(%1, '%2', '%3', '%4');";
str = strF.arg("1")
.arg("Piggy")
.arg("+49 631322187")
.arg("piggy@mega.de");
query.exec(str);
str = strF.arg("2")
.arg("Kermit")
.arg("+49 631322181")
.arg("kermit@mega.de");
query.exec(str);
//////////////////////////////////////////////////////////////////////////
m_model.setTable("addressbook");
m_model.select();
ui.tableView->setModel(&m_model);
ui.tableView->show();
}
cwin::~cwin()
{
}
bool cwin::createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("addressbook");
db.setUserName("elton");
db.setHostName("epica");
db.setPassword("password");
if (!db.open()) {
qDebug() << "Cannot open database:" << db.lastError();
return false;
}
return true;
}
Вместо:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
написать:
db = QSqlDatabase::addDatabase("QSQLITE");???
Пы.Сы. В заголовочном файле класса db должен быть объявлен:
QSqlDatabase db;
а какая разница? объект QSqlDatabase все равно один на всю программу - синглтон
ну попробуем по-другому... покажите вывод qDebug() << db.isOpen(); перед заполнением таблицы.
И лучше, все-таки, следить за тем что творит запрос:
QSqlQuery query;
QString str = "CREATE TABLE addressbook ( "
"number INTEGER PRIMARY KEY NOT NULL, "
"name VARCHAR(15), "
"phone VARCHAR(12), "
"email VARCHAR(15) "
");";
if(!query.exec(str)) qDebug() << query.lastError().text();
bool b = createConnection();
QSqlQuery query;
QString str = "CREATE TABLE addressbook ( "
"number INTEGER PRIMARY KEY NOT NULL, "
"name VARCHAR(15), "
"phone VARCHAR(12), "
"email VARCHAR(15) "
");";
qDebug() << db.isOpen();
if (!query.exec(str)) {
qDebug() << query.lastError().text();
}
//Adding some information
QString strF =
"INSERT INTO addressbook (number, name, phone, email) "
"VALUES(%1, '%2', '%3', '%4');";
str = strF.arg("1")
.arg("Piggy")
.arg("+49 631322187")
.arg("piggy@mega.de");
if (!query.exec(str)) {
qDebug() << query.lastError().text();
}
str = strF.arg("2")
.arg("Kermit")
.arg("+49 631322181")
.arg("kermit@mega.de");
if (!query.exec(str)) {
qDebug() << query.lastError().text();
}
//////////////////////////////////////////////////////////////////////////
m_model.setTable("addressbook");
m_model.select();
bool b2 = db.isOpen();
ui.tableView->setModel(&m_model);
true
if(!query.exec(str)) qDebug() << query.lastError().text(); // какая ошибка в запросе то? То что с БД все впорядке мы увидели
m_model.setTable("addressbook");
m_model.select();
Вообще данные есть - открывал создавшуюся базу в текстовом редакторе
В заголовочном файле:
QSqlTableModel *m_model;
//////////////////////////////////////////////////////////////////////////
m_model = new QSqlTableModel();
m_model->setTable("addressbook");
m_model->select();
bool b2 = db.isOpen();
ui.tableView->setModel(m_model);
Заработало! думаю проблема была в том что
m_model = new QSqlTableModel(); надо было делать после создания бд
Вот моя проблема из соседнего обсуждения :
Занимаюсь аналогичной проблемой уже длительное время. Подключение к БД осуществляется следующим образом
создаем файл connection.h:
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QtSql>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("такая_то_база");
db.setUserName("логин_такой_то");
db.setPassword("пароль_эдакий");
bool connected = db.open();
if (!connected) {
QMessageBox::critical(0, ("connection.h "),"Cannot open database =[\n " +(db.lastError().text()), QMessageBox::Cancel);
return false;
}
}
#endif // CONNECTION_H
Затем из main.cpp обращаемся к данному заголовочному файлу:
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "connection.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.driverName()="count";
app.addLibraryPath("pugins");
if (!createConnection()){
QMessageBox::critical(0, ("main.cpp"),"Cannot open database =[\n" +(db.lastError().text()), QMessageBox::Cancel);
return 1;
}
MainWindow w;
w.show();
return app.exec();
}
Затем, если у тебя window xp и MSSQL server, создаем драйвер подключения с именем нашей базы данных
Панель управления\ Администрирование\Источники данных (ODBC)\вкладка Системный DSN кнопочка добавить
Выбираем драйвер SQL Server Native Client и указываем его имя, как имя нашей базы данных.
Барабанная дробь........... Тада, теперь можно подключаться к ODBC базе данных.
Однако здесь только все начинается, по умолчанию QT использует только драйвера SQLite, а нам же нужен драйвер qsqlodbc4.dll и libqsqlodbc4.lib, которые лежат в папке qtdir\qt\plugins\sqldrivers.
Увы, как их подключить я не знаю, необходимо что-то прописать в .pro файле.
При компиляции massegeBox из main.cpp говорит следующее: Driver not loaded. Driver not losaded.
Вот результаты компиляции:
Запускается C:\Qt\TechJ\TechJ-build-desktop\debug\TechJ.exe...
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
C:\Qt\TechJ\TechJ-build-desktop\debug\TechJ.exe завершился с кодом 1
Подозреваю, что проблема в библиотеках, вернее в их отсутствии.
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>
#include <QtSql>
class Widget : public QWidget{
Q_OBJECT
QSqlDatabase db;
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
#include "widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent){
bd = QSqlDatabase::addDatabase("QODBC");
bd.setDatabaseName("MyDB");
bd.setUserName("username");
bd.setPassword("userpassword");
if(!db.open()) qDebug() << "Can't open DB: " << db.lastError().text();
// теперь можете работать со своей БД, например выполнять простые запросы:
QSqlQuery query;
if(query.exec("SELECT * FROM [sometable]")) qDebug() << "Selected: " << query.numRowsAffected() << "rows";
else qDeubg() << "error: " << query.lastError().text();
}
Borodeys, форматируй код (тэг: code)
Вуху, заработало! Огромное спасибо silver47.
А у меня еще один вопрос, как в SQL запросе использовать значения с timeEdit виджета? То есть
"SELECT Val FROM dbo.CountHour WHERE TagIndex = 67 AND Dateandtime >= timeEdit AND Dateandtime < timeEdit_2"
ну или как-то так, при выполнении данного запроса MS server говорит, что колонок timeEdit и timeEdit_2 не существует.
Ну во-первых WHERE (условие) AND (условие).
Во-вторых лучше делать таким образом:
query.prepare("SELECT val FROM dbo.COUNTHOUR WHERE (tagindex = :tindex) AND (dateandtime >= :start) AND (dateandtime < :stop)");
query.bindValue(":tindex", 67);
query.bindValue(":start", QDateTime::currentDateTime.addMonth(-1));
query.bindValue(":stop", QDateTime::currentDateTime.addMonth);
if(!query.exec()) qDebug() << query.lastError().text();
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)