QT执行MYSQL语句问题解决

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";//<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()<value(0).toString()<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 


 [成都]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也在一个函数域里,,答案也是成功 

——————————————————
解决方法二:
连接成功后,立即将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";//<



你可能感兴趣的:(【05】QT)