• 5591阅读
  • 5回复

为什么调用打印功能的时候会释放数据库连接?? [复制链接]

上一主题 下一主题
离线xw884187
 
只看楼主 倒序阅读 楼主  发表于: 2007-12-17
— 本帖被 XChinux 执行加亮操作(2008-07-17) —
        本人写了一个小的数据库应用程序,Windows平台。 数据查询都是用QSqlTableModel,显示用TableView! 数据库采用的是Access,在程序初始化的时候就加载数据库,初始数据引擎,这些都很正常,但是当写到打印功能的时候,每次调用打印功能时,程序与数据库的连接都会自动断开, 而且在程序中也不能再建立数据库连接了, 必须重新启动程序才行!
    弄了很久也不知道到底是什么原因, 请高手赐教!!!不甚感激!!

   
    QMainWindow窗口, 打印采用的是QTextDocument类来实现HTML格式的打印!!!
离线XChinux

只看该作者 1楼 发表于: 2007-12-17
楼主可发一下相关代码看看
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xw884187
只看该作者 2楼 发表于: 2007-12-17
数据连接初始化代码:
bool CDatabase::createConnection()
{
    db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=db\\stsx_contract.mdb");
    if (!db.isValid() || !db.isOpen())
    {
        if (db.open())
            return true;
        else
        {
            QMessageBox::critical(0, "Cannot open database",
                    "Unable to establish a database connection.\n"
                                     "This example needs SQLODBC support. Please read "
                                     "the Qt SQL driver documentation for information how "
                                     "to build it.\n\n"
                                     "Click Cancel to exit.", QMessageBox::Cancel);
            return false;
        }
    }
    return false;
}

这个是在程序初始化的时候就调用了。

打印程序的片段:
QPrinter printer;;
        printer.setPageSize(QPrinter::A4);
        printer.setFullPage(true);
        QPrintDialog printDialog(&printer, this);
        QTextDocument *textDocument = new QTextDocument();
        textDocument->setHtml(reporter.createReport(id, name, linkman, unit, unitlinkman, city, date, cost, remark));
       
        if (printDialog.exec() == QDialog::Accepted)
        {
            textDocument->print(&printer);
        }

reporter.createReport(id, name, linkman, unit, unitlinkman, city, date, cost, remark)  这个会调用另外一个类, 从数据库中提取要打印的数据,组合成Html格式。

提取数据组合成Html字串的函数之一
QString Reporter::createDeviceReport(QString contractid)
{
    QString report;
    report += "<table border='1' width='100%' id='table2'>"
                "<tr>"
                    "<td colspan='6' align='center'><b>"+QApplication::tr("device details")+"</b></td>"
                "</tr>"
                "<tr>"
                    "<td width='15%' align='center'><b>"+QApplication::tr("device mode")+"</b></td>"
                    "<td width='15%' align='center'><b>"+QApplication::tr("device name")+"</b></td>"
                    "<td width='5%' align='center'><b>"+QApplication::tr("device amount")+"</b></td>"
                    "<td width='5%' align='center'><b>"+QApplication::tr("device price")+"</b></td>"
                    "<td width='6%' align='center'><b>"+QApplication::tr("device cost")+"</b></td>"
                    "<td width='54%' align='center'><b>"+QApplication::tr("device remark")+"</b></td>"
                "</tr>";
    QSqlQuery query("SELECT * FROM t_device WHERE contractid = '"+contractid+"'");
    while (query.next())
    {
        report +="<tr>"
                    "<td width='15%' align='center' nowrap>"+query.value(2).toString()+"</td>"
                    "<td width='15%' align='center' nowrap>"+query.value(3).toString()+"</td>"
                    "<td width='5%' align='center'>"+query.value(4).toString()+"</td>"
                    "<td width='5%' align='center'>"+query.value(5).toString()+"</td>"
                    "<td width='6%' align='center'></td>"
                    "<td width='54%'>"+query.value(6).toString()+"</td>"
                "</tr>";
    }
    report += "</table>";
   
    return report;
}


请帮看看, 谢谢!
离线xw884187
只看该作者 3楼 发表于: 2007-12-17
      又试验了一下,其实只要是调用了打印功能,实施了打印操作,甭管是不是QTextDocument, 应用程序都自动释放对数据库的连接,而且不能在程序中再次做数据库连接操作。。。真是更加郁闷了!!
离线xw884187
只看该作者 4楼 发表于: 2007-12-19
唉, 终于知道是什么原因了, 就是因为使用了QSqlTableModel的setFilter()函数, 结果打印后就会释放数据库连接, 但不知道为什么会这样??? 有高人不?
离线xw884187
只看该作者 5楼 发表于: 2007-12-19
我用的Qt是4.3.1的Open Source版本, 不晓得别的版本有没有这个问题。 希望有人帮忙测试一下。郁闷得慌。
快速回复
限100 字节
 
上一个 下一个