int ServerBase::DBConnection() { m_sqldb = QSqlDatabase::addDatabase(DB_SALES_DRIVER); m_sqldb.setHostName(DB_SALES_HOST); m_sqldb.setDatabaseName(DB_SALES_DBNAME); m_sqldb.setUserName(DB_SALES_USER); m_sqldb.setPassword(DB_SALES_PASSWD); if( !m_sqldb.open()) { m_dbconnected = false; qDebug()<<" [Error] "<<"Database open error";//<<m_sqlquery.lastError(); return R_ERROR; } else { m_dbconnected = true; qDebug()<<" [OK] "<<"Database opened"; } return R_OK; } int result = this->DBConnection(); m_sqlquery = new QSqlQuery("",m_sqldb);//statement 1:connect db with sqlquery if(result == R_OK) { result = m_sqlquery->exec("INSERT INTO children(fname,age) VALUES('Ann2',13)"); if(!result) qDebug()<<" [OK] "<<"EXEC successed"; m_sqlquery->exec("SELECT * FROM children c LIMIT 0,1000"); while(m_sqlquery->next()) { qDebug()<<m_sqlquery->value(0).toString()<<m_sqlquery->value(1).toString(); } } //Debug输出: [OK] Database opened "1" "Ann" "2" "Ann" "3" "Ann2" "4" "Ann2" [OK] Database closed
没有加statement 1之前的问题Debug输出:
:
"QSQLITE"
"QMYSQL3"
"QMYSQL"
[OK] Database opened
QSqlQuery::exec: database not open
[OK] Database closed
"QMYSQL3"
"QMYSQL"
[OK] Database opened
QSqlQuery::exec: database not open
[OK] Database closed
[成都]Jason(642366168) 21:39:33
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "in_mem_db");
QSqlQuery q("", db);
q.exec("drop table Movies");
这是一个例子
你把上面类似的db传给了QSqlQuery了吗?!
如果没有
[武汉]新手(19619972) 21:40:08
这个不是必须的
我以前试过
[成都]Jason(642366168) 21:40:21
你的QSqlQuery是查询谁呢?!
它能默认知道?!
好吧,不必须,,你说的,,你加上再试,如果没有再出现这样的情况,你就承认是必须的吧
[沈阳]小青鸟(872015123) 21:40:59
稍等我试试
[沈阳]小青鸟(872015123) 21:46:07
OK,果然是[成都]Jason说的那个问题,多谢
[成都]Jason(642366168) 21:46:16
成功了?!
你想知道原因吗?!
[沈阳]小青鸟(872015123) 21:46:21
OK
[沈阳]小青鸟(872015123) 21:46:32
你刚才 说的对
[成都]Jason(642366168) 21:46:36
当然你也可以坚持之前的认为
[沈阳]小青鸟(872015123) 21:46:36
没有关联起来
[成都]Jason(642366168) 21:46:39
原因是
createDatabaseconnection
通常是static的
[武汉]新手(19619972) 21:47:06
- - 我以前DB申明的是全部变量
[成都]Jason(642366168) 21:47:15
所以,,,程序其它地方可以不带上那个db
[武汉]新手(19619972) 21:47:17
没碰到这样的错误- -
[成都]Jason(642366168) 21:47:27
对于你的非static的...
作用域的问题了.....
你就必须了!
还有,,如果
你的query.exec和createDatabase在一个函数作用域里面...你也可以不用带上那个db
[武汉]新手(19619972) 21:48:29
嗯嗯
[沈阳]小青鸟(872015123) 21:48:37
哦 哦 ,我分开写的
有没有相关资料,我网上查了半天也没找着相关说明
[成都]Jason(642366168) 21:49:16
其实我也近一年没接触sql了....呵呵...不过问题就是这样
资料,,,我也记不信了
不住了
[武汉]新手(19619972) 21:49:48
不过我那个问题到现在还没解决
就是什么 好像最后析构的时候的问题
[武汉]新手(19619972) 21:50:20
说默认的数据库连接怎么来着的
[成都]Jason(642366168) 21:50:25
你可以试着再把exec和createDatabase放一个函数域里面试试,不带那个db的情况,,,答案是成功的
[沈阳]小青鸟(872015123) 21:51:22
像你说的,把db声明为static也是可以成功的呗
[成都]Jason(642366168) 21:51:58
我说的是把你创建db的那个函数声明成static的...
答案应该是成功
[沈阳]小青鸟(872015123) 21:52:12
哦
[成都]Jason(642366168) 21:52:33
如果不声明成static,,但你的query.exec也在一个函数域里,,答案也是成功
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "in_mem_db");
QSqlQuery q("", db);
q.exec("drop table Movies");
这是一个例子
你把上面类似的db传给了QSqlQuery了吗?!
如果没有
[武汉]新手(19619972) 21:40:08
这个不是必须的
我以前试过
[成都]Jason(642366168) 21:40:21
你的QSqlQuery是查询谁呢?!
它能默认知道?!
好吧,不必须,,你说的,,你加上再试,如果没有再出现这样的情况,你就承认是必须的吧
[沈阳]小青鸟(872015123) 21:40:59
稍等我试试
[沈阳]小青鸟(872015123) 21:46:07
OK,果然是[成都]Jason说的那个问题,多谢
[成都]Jason(642366168) 21:46:16
成功了?!
你想知道原因吗?!
[沈阳]小青鸟(872015123) 21:46:21
OK
[沈阳]小青鸟(872015123) 21:46:32
你刚才 说的对
[成都]Jason(642366168) 21:46:36
当然你也可以坚持之前的认为
[沈阳]小青鸟(872015123) 21:46:36
没有关联起来
[成都]Jason(642366168) 21:46:39
原因是
createDatabaseconnection
通常是static的
[武汉]新手(19619972) 21:47:06
- - 我以前DB申明的是全部变量
[成都]Jason(642366168) 21:47:15
所以,,,程序其它地方可以不带上那个db
[武汉]新手(19619972) 21:47:17
没碰到这样的错误- -
[成都]Jason(642366168) 21:47:27
对于你的非static的...
作用域的问题了.....
你就必须了!
还有,,如果
你的query.exec和createDatabase在一个函数作用域里面...你也可以不用带上那个db
[武汉]新手(19619972) 21:48:29
嗯嗯
[沈阳]小青鸟(872015123) 21:48:37
哦 哦 ,我分开写的
有没有相关资料,我网上查了半天也没找着相关说明
[成都]Jason(642366168) 21:49:16
其实我也近一年没接触sql了....呵呵...不过问题就是这样
资料,,,我也记不信了
不住了
[武汉]新手(19619972) 21:49:48
不过我那个问题到现在还没解决
就是什么 好像最后析构的时候的问题
[武汉]新手(19619972) 21:50:20
说默认的数据库连接怎么来着的
[成都]Jason(642366168) 21:50:25
你可以试着再把exec和createDatabase放一个函数域里面试试,不带那个db的情况,,,答案是成功的
[沈阳]小青鸟(872015123) 21:51:22
像你说的,把db声明为static也是可以成功的呗
[成都]Jason(642366168) 21:51:58
我说的是把你创建db的那个函数声明成static的...
答案应该是成功
[沈阳]小青鸟(872015123) 21:52:12
哦
[成都]Jason(642366168) 21:52:33
如果不声明成static,,但你的query.exec也在一个函数域里,,答案也是成功
——————————————————
解决方法二:
连接成功后,立即将db与query连接起来。如下code
m_sqldb = QSqlDatabase::addDatabase(DB_SALES_DRIVER);
m_sqldb.setHostName(DB_SALES_HOST);
m_sqldb.setDatabaseName(DB_SALES_DBNAME);
m_sqldb.setUserName(DB_SALES_USER);
m_sqldb.setPassword(DB_SALES_PASSWD);
if( !m_sqldb.open())
{
m_dbconnected = DB_UNCONNECTED;
qDebug()<<" [Error] "<<"Database open error";//<<m_sqlquery.lastError();
return R_ERROR;
}
else
{
m_sqlquery = new QSqlQuery("",m_sqldb);
m_dbconnected = DB_CONNECTED;
qDebug()<<" [OK] "<<"Database opened";
}