查看完整版本: [-- 【真心求助】在google,baidu找了好几天,还是无法加载ODBC驱动。希望QTCN的朋友能帮帮我!感谢! --]

QTCN开发网 -> Qt基础编程 -> 【真心求助】在google,baidu找了好几天,还是无法加载ODBC驱动。希望QTCN的朋友能帮帮我!感谢! [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

htq110219891 2012-01-06 16:38

【真心求助】在google,baidu找了好几天,还是无法加载ODBC驱动。希望QTCN的朋友能帮帮我!感谢!


真诚求助QTCN的大神们


问题描述:使用QODBC来实现导出QTableView 中的Sqlite数据,格式为Excel。


本机软件相关:QT4.7.3。Win7系统。安装程序:Qt_SDK_Win_offline_v1_1_2_en


提示错误:
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers: QSQLITE
ExportExcelObject::export2Excel failed: QODBC not supported.

本人尝试方法:1、在QtSDK\Desktop\Qt\4.7.3\mingw\plugins\sqldrivers目录下加入文件qsqlodbc4.dll、qsqlodbcd4.dll、libqsqlodbc4.a、libqsqlodbcd4.a。
                        2、在程序目录下建立文件夹sqldrivers,加入以上4个文件。
                        3、在Win7管理工具-数据源(ODBC)中加入系统DNS-QODBC-Driver do Microsoft Excel(*.xls)
                        4、安装SQLServer,Office
                        5、重新编译QT中的ODBC,把生成文件拷贝到sqldrivers目录下
                        6、安装QT4.7.4,并把4.7.3中的sqldrivers目录拷贝过去
                        7、更换电脑重新尝试。
                        8、把sqldrivers目录加入Path


以上方法均无效果。


备注:代码中加入:qDebug() << QSqlDatabase::drivers(); 返回值:("QSQLITE")


源代码:
widget.cpp
QString fileName = QFileDialog::getSaveFileName(this, tr("Excel file"), qApp->applicationDirPath (),
                                                    tr("Excel Files (*.xls)"));
    if (fileName.isEmpty())
        return;

    ExportExcelObject obj(fileName, "mydata", ui->tableView);

    // you can change the column order and
    // choose which colum to export
    obj.addField(0, "colum1", "char(20)");
    obj.addField(1, "colum2", "char(20)");
    obj.addField(2, "colum3", "char(20)");
    obj.addField(3, "colum4", "char(20)");
    obj.addField(4, "colum5", "char(20)");
    obj.addField(5, "colum6", "char(20)");
    obj.addField(6, "colum7", "char(20)");
    obj.addField(7, "colum8", "char(20)");

    int retVal = obj.export2Excel();

    if( retVal > 0)
    {
        QMessageBox::information(this, tr("Done"),
                                 QString(tr("%1 records exported!")).arg(retVal)
                                 );
    }
exportexcelobject.cpp

#include "exportexcelobject.h"
#include <QSqlQuery>
#include <QtDebug>
#include <QVariant>


int ExportExcelObject::export2Excel()
{
    if(fieldList.size() <= 0)
    {
        qDebug() << "ExportExcelObject::export2Excel failed: No fields defined.";
        return -1;
    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "excelexport");
    if(!db.isValid())
    {
        qDebug() << "ExportExcelObject::export2Excel failed: QODBC not supported.";
        return -2;
    }
    // set the dsn string
    QString dsn = QString("DRIVER={Microsoft Excel Driver (*.xls)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%1\";DBQ=%2").
                  arg(excelFilePath).arg(excelFilePath);
    db.setDatabaseName(dsn);
    if(!db.open())
    {
        qDebug() << "ExportExcelObject::export2Excel failed: Create Excel file failed by DRIVER={Microsoft Excel Driver (*.xls)}.";
        //QSqlDatabase::removeDatabase("excelexport");
        return -3;
    }

    QSqlQuery query(db);

    //drop the table if it's already exists
    QString s, sSql = QString("DROP TABLE [%1] (").arg(sheetName);
    query.exec(sSql);

    //create the table (sheet in Excel file)
    sSql = QString("CREATE TABLE [%1] (").arg(sheetName);
    for (int i = 0; i < fieldList.size(); i++)
    {
        s = QString("[%1] %2").arg(fieldList.at(i)->sFieldName).arg(fieldList.at(i)->sFieldType);
        sSql += s;
        if(i < fieldList.size() - 1)
            sSql += " , ";
    }

    sSql += ")";
    query.prepare(sSql);

    if(!query.exec())
    {
        qDebug() << "ExportExcelObject::export2Excel failed: Create Excel sheet failed.";
        //db.close();
        //QSqlDatabase::removeDatabase("excelexport");
        return -4;
    }

    //add all rows
    sSql = QString("INSERT INTO [%1] (").arg(sheetName);
    for (int i = 0; i < fieldList.size(); i++)
    {
        sSql += fieldList.at(i)->sFieldName;
        if(i < fieldList.size() - 1)
            sSql += " , ";
    }
    sSql += ") VALUES (";
    for (int i = 0; i < fieldList.size(); i++)
    {
        sSql += QString(":data%1").arg(i);
        if(i < fieldList.size() - 1)
            sSql += " , ";
    }
    sSql += ")";

    qDebug() << sSql;

    int r, iRet = 0;
    for(r = 0 ; r < tableView->model()->rowCount() ; r++)
    {
        query.prepare(sSql);
        for (int c = 0; c < fieldList.size(); c++)
        {
            query.bindValue(QString(":data%1").arg(c), tableView->model()->data(tableView->model()->index(r, fieldList.at(c)->iCol)));
        }

        if(query.exec())
            iRet++;

        if(r % 10 == 0)
            emit exportedRowCount(r);
    }

    emit exportedRowCount(r);

    return iRet;
}exportexcelobject.h

// Copyright (c) 2010 Joel Gao <joel_gao@sina.com>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
///////////////////////////////////////////////////////////////////////////////

#ifndef EXPORTEXCELOBJECT_H
#define EXPORTEXCELOBJECT_H

#include <QObject>
#include <QTableView>
#include <QStringList>
#include <QSqlDatabase>

class EEO_Field
{
public:
    EEO_Field(const int ic, const QString &sf, const QString &st):
            iCol(ic),sFieldName(sf),sFieldType(st){};

    int     iCol;
    QString sFieldName;
    QString sFieldType;
};

class ExportExcelObject : public QObject
{
    Q_OBJECT
public:
    ExportExcelObject(const QString &filepath, const QString &sheettitle,
                      QTableView *tableview):excelFilePath(filepath),
                      sheetName(sheettitle), tableView(tableview){};

    ~ExportExcelObject() {QSqlDatabase::removeDatabase("excelexport");};

public:
    void setOutputFilePath(const QString &spath) {excelFilePath = spath;};
    void setOutputSheetTitle(const QString &ssheet) {sheetName = ssheet;};
    void setTableView(QTableView *tableview) {tableView = tableview;};

    void addField(const int iCol, const QString &fieldname, const QString &fieldtype)
         {fieldList << new EEO_Field(iCol, fieldname, fieldtype);};

    void removeAllFields()
         {while (!fieldList.isEmpty()) delete fieldList.takeFirst();};

    int export2Excel();

signals:
    void exportedRowCount(int row);

private:
    QString excelFilePath;
    QString sheetName;
    QTableView *tableView;
    QList<EEO_Field *> fieldList;
};

#endif // EXPORTEXCELOBJECT_H







roywillow 2012-01-07 00:16
只能帮你顶一下了
没用过这方面的东西

htq110219891 2012-01-09 15:59
求助大家帮帮忙哇~~~

pan869823184 2012-03-02 11:12
我跟你遇到过同样的问题,我XP上面我弄正常可以访问ODBC数据源了!现在在编译Linux上的~顺便给你借鉴
我安装是qtcreator-2.4.0+Qt_SDK_Win_offline_v1_1_2_en,你把QtSDK安装过后,新版的QT自带有驱动器实现步骤:
将\Qt\qtcreator-2.4.0\bin\sqldrivers里面的qsqlodbc4.dll qsqlodbc4.lib qsqlodbcd4.dll qsqlodbcd4.lib 拷贝到\QtSDK\Desktop\Qt\4.8.0\msvc2008\plugins\sqldrivers的目录
前提条件是你需要安装MinGW编译器,在程序里面的头文件里面需要加一句代码  QT+=“数据对象名”比如我连的是MYSQL,所以我加了头文件QT+=mysql 
如果上面还不能访问,你可以将上面的DLL拷贝到\QtSDK\QtCreator\bin\sqldrivers即可
如果你没有上面的文件,我可以给你,发帖联系我哈


查看完整版本: [-- 【真心求助】在google,baidu找了好几天,还是无法加载ODBC驱动。希望QTCN的朋友能帮帮我!感谢! --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled