【问题标题】:QODBC connects to SQL server but can not execute queriesQODBC 连接到 SQL 服务器但无法执行查询
【发布时间】:2016-06-22 02:46:30
【问题描述】:

标题说明了大部分情况。我可以确认我正在连接到数据库,并且在尝试进行查询之前我肯定会打开连接。问题是,每次我通过 exec(query) 发送查询时,都会收到一条错误消息,指出我的 QODBC 驱动程序未加载。如果真的是这样,那么我什至如何开始建立联系?更重要的是,我如何重新编写代码或配置一些东西以便加载我的驱动程序?

一些需要填补的空白:

  • popupwindows.h 是控制AlertWindow、ErrorWindow 和Success Window 的东西,根本不影响这里的任何东西。
  • 我得到所有常量和数据都很好,所以这与我如何组合我的 SQL 查询无关,例如:

INSERT INTO RegTable(Project_ID, Project_Name, Cycle, Number, B1, B2, B3, Horiz, Vert, Skew) VALUES (117.001, ZT400-300DPI, 0, 1, 1, 2, 3, 4, 5, 6 )

  • 当我启动 sendData() 函数时,我得到了 db.isOpen() 和 db.isValid() 的真实值,尽管我在排除了它们检查的错误后将它们取出。

  • 我的应用程序目录中的多个文件夹中有 qsqlodbc.dll 和 qsqlodbcd.dll,但最重要的是在

    C:\path\to\built\project\debug\sqldrivers
    

对不起,我想确保你们都拥有所需的一切。

数据库连接.cpp:

#include <QFile>
#include <QTextStream>
#include <QSqlError>
#include <QSqlQuery>
#include "databaseconnection.h"
#include "popupwindows.h"

DatabaseConnection::DatabaseConnection(QWidget *parent, QString type) {
    this->setParent(parent);
    log = new EventLog("DatabaseConnection");
    connected = false;
    db = QSqlDatabase::addDatabase("QODBC");        //note that this is a QString, not a QSqlDriver
    loadParams();
    connectDB(type);
}

DatabaseConnection::~DatabaseConnection() {
    db.close();
}

bool DatabaseConnection::connectDB( QString driverString) {
    if (!db.isOpen()) {
        if (db.isValid() && db.isDriverAvailable(driverString)) {
            QString connParams = QString("Driver={SQL SERVER};DSN=ODBCDriverForLocal;SERVER=" + server +";DATABASE="
                                     + database + ";Uid=" + username +";Pwd=" + password);
        db.setDatabaseName(connParams);
        log->print("Attempting to connect to database: " + connParams);
        if(!db.open()) {
            log->printerr("Could not connect to database: " + db.lastError().text());
            connected = false;
            ErrorWindow(0, "Database connection could not be established\n" + db.lastError().text());
               return false;
            } else {
                log->print("Database connection established.");
                connected = true;
                SuccessWindow(0, "Database connection established");
                return true;
            }
        } else {
            ErrorWindow(0, "Driver not available or valid.");
        }
    } return true;
}

void DatabaseConnection::disconnect() {
    if (db.isOpen()) {
        db.close();
    }
}

void DatabaseConnection::loadParams() {
    QFile settings("dbSettings.txt");
    if (!settings.open(QIODevice::ReadOnly | QIODevice::Text)) {
        server = QString("Server String");
        database = QString("Database String");
        username = QString("Username");
        password = QString("Password");
    } else {
        QTextStream in(&settings);
        server = in.readLine();
        database = in.readLine();
        username = in.readLine();
        password = in.readLine();
    }
}

void DatabaseConnection::updateParams(QString params) {
    disconnect();
    QStringList parameters = params.split(";");
    server = parameters[0];
    database = parameters[1];
    username = parameters[2];
    password = parameters[3];
}

void DatabaseConnection::sendData(QString mode, QVector<QString> *data) {
    log->print("Prepping Data for Sending...");
    int cols;
    if(connectDB()) {
        db.exec(QString("USE " + database));
        QVector<QString> *dataQueue = new QVector<QString>;
        //collect all the data
        if (mode == QString("DK")) {
            extractData(mode, 15, 31, dataQueue, data);
            cols = 15;
        } else if (mode == QString("PQ")) {
            extractData(mode, 17, 200, dataQueue, data);
            cols = 17;
        } else {
            extractData(mode, 6, 200, dataQueue, data);
            cols = 6;
        }
        //create a query for each entry
        for (int i =0; i < (dataQueue->size() / cols); i++) {
            QString query("INSERT INTO ");
            emit requestConsts();
            if (mode == QString("Reg")) {
                 query += "RegTable(Project_ID, Project_Name, Cycle, Number, B1, B2, B3, Horiz, Vert, Skew) VALUES (";
            } else if (mode == QString("PQ")) {
                query += "PQTable(Project_ID, Project_Name, Cycle, Number, B1, B2, B3, [3DOTCD128_ScoreA], [3DOTCD128_GradeA],"
                     " [3DOTCD128_ScoreB], [3DOTCD128_GradeB], [10CR3DT128_Score], [10CR3DT128_Grade], [12CHAR3DOT39_Score],"
                     " [12CHAR3DOT39_Grade], [12CHAR4DOT39_Score], [12CHAR4DOT39_Grade], [2DOTDATAMATRIX_Score],"
                     " [2DOTDATAMATRIX_Grade], [3DOTDATAMATRIX_Score], [3DOTDATAMATRIX_Grade]) VALUES (";
            } else {
                 query += "DKTable(Project_ID, Project_Name, Cycle, Darkness, [3DOTCD128_ScoreA], [3DOTCD128_GradeA],"
                     " [3DOTCD128_ScoreB], [3DOTCD128_GradeB], [10CR3DT128_Score], [10CR3DT128_Grade], [12CHAR3DOT39_Score],"
                     " [12CHAR3DOT39_Grade], [12CHAR4DOT39_Score], [12CHAR4DOT39_Grade], [2DOTDATAMATRIX_Score],"
                     " [2DOTDATAMATRIX_Grade], [3DOTDATAMATRIX_Score], [3DOTDATAMATRIX_Grade]) VALUES (";
            }
            query += "" + constants;
            for (int j = 0; j < cols; j++) {
                int index = (i * cols) + j;
                query += ", " + dataQueue->at(index);
            }
            query += (")");
            log->print(query);
            QSqlQuery postedQuery = QSqlQuery(db);
            if (!postedQuery.exec(query)) {
                AlertWindow(0, this->lastError().text());
            }
        }
        //push the queries into action if not already being performed
        db.exec(QString("GO"));
        log->print("Data Sent.");
        SuccessWindow(0, "Data (theoretically) Sent!");
    }
}

void DatabaseConnection::getConsts(QString consts) {
    constants = consts;
}

void DatabaseConnection::extractData(QString mode, int cols, int rows, QVector<QString> *queue, QVector<QString> *data) {
    log->print("Extracting Data...");
    log->print(mode + " Mode");
    for (int row = 0; row < rows; row++) {
        QVector<QString> thisLine;
        for (int col = 0; col < cols; col++) {
            int index = (row * cols) + col;
            thisLine.append(data->at(index));
        }
        if (mode == QString("DK")) {
            if (!thisLine.at(0).isEmpty() && (!thisLine.at(1).isEmpty() || !thisLine.at(3).isEmpty() || !thisLine.at(5).isEmpty() || !thisLine.at(7).isEmpty() || !thisLine.at(9).isEmpty() || !thisLine.at(11).isEmpty() || !thisLine.at(13).isEmpty())) {
                for (int i = 0; i < cols; i++) {
                    queue->append(thisLine.at(i));
                    //log->print(thisLine.at(i));
                }
            }
        } else if (mode == QString("PQ")) {
            if ((!thisLine.at(0).isEmpty() && !thisLine.at(1).isEmpty() && !thisLine.at(2).isEmpty()) || (!thisLine.at(5).isEmpty() || !thisLine.at(7).isEmpty() || !thisLine.at(9).isEmpty() || !thisLine.at(11).isEmpty() || !thisLine.at(13).isEmpty() || !thisLine.at(15).isEmpty())) {
                for (int i = 0; i < cols; i++) {
                    queue->append(thisLine.at(i));
                    //log->print(thisLine.at(i));
                }
            }
        } else {
            if ((!thisLine.at(0).isEmpty() && !thisLine.at(1).isEmpty() && !thisLine.at(2).isEmpty()) || (!thisLine.at(3).isEmpty() || !thisLine.at(4).isEmpty() || !thisLine.at(5).isEmpty())) {
                for (int i = 0; i < cols; i++) {
                    queue->append(thisLine.at(i));
                    //log->print(thisLine.at(i));
                }
            }
        }
    }
}

编辑 2016 年 6 月 21 日 - 我做了更多研究,发现我错误地使用了 DSN 参数。即使我正确使用它,我的问题仍然存在,所以那里没有太多进展,只是一些方便的花花公子学习。

【问题讨论】:

  • 你真的打开过连接吗?
  • 如果您将db.exec(QString("USE " + database)); 更改为也使用QSqlQuery,该错误是否已经出现在该行上?如果我没记错的话,你根本不需要USE $DB,因为它已经在连接字符串中定义了。您是否会尝试在不使用 DSN 的情况下进行连接,以澄清连接期间没有无法识别的问题(请参阅wiki.qt.io/ODBC)?
  • @SebastianLange,我按照你的建议做了,并检查了 QSqlQuery 对象的 "USE " + database 的结果,并且没有引发错误,所以我猜它正确接收了一些命令。不幸的是,这有点让这更加令人困惑哈哈。我还删除了 DSN(实际上我就是这样开始的,没有一个),同样的“未加载驱动程序未加载驱动程序”错误又回来了。

标签: c++ sql-server qt odbc


【解决方案1】:

我想通了! VALUES 中的东西需要用单引号括起来

INSERT INTO RegTable(Project_ID, Project_Name, Cycle, Number, B1, B2, B3, Horiz, Vert, Skew) VALUES ('117.001', 'ZT400-300DPI', '0', '1', '1', '2', '3', '4', '5', '6')

这对我来说似乎有点傻,但我相信这是一个经过深思熟虑的原因(如果你知道的话,一定要启发我!)。感谢那些所做的帮助,就我而言,它让我来到了这里,你回答了这个问题:)

旁注:错误报告是彻头彻尾的垃圾。驱动程序和数据库都报告“未加载驱动程序”甚至与发生的情况相差甚远。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多