QODBC 连接到 SQL 服务器但无法执行查询
QODBC connects to SQL server but can not execute queries
标题说明了大部分内容。我可以确认我正在连接到数据库,并且在我尝试进行查询之前肯定会打开连接。问题是,每次我通过 exec(query) 发送查询时,我都会收到一条错误消息,指出我的 QODBC driver 未加载。如果情况确实如此,那么我什至如何开始建立联系?更重要的是,我如何 re-write 我的代码或配置一些东西以便我的 driver 被加载?
填补空白的一些东西:
- 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
抱歉 wall-o-code 但我想确保你们都拥有所需的一切。
databaseconnection.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 参数不正确。即使我正确使用它,我的问题仍然存在,所以那里没有太大的进步,只是一些方便的花花公子学习。
我想通了! 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')
这对我来说似乎有点傻,但我确信这是有深思熟虑的理由的(如果你知道,一定要启发我!)。感谢那些帮助过我的人,就我而言,你已经回答了我的问题:)
旁注:错误报告对此完全是垃圾。驱动程序和数据库报告 "Drivers not loaded" 与发生的事情还差得很远。
标题说明了大部分内容。我可以确认我正在连接到数据库,并且在我尝试进行查询之前肯定会打开连接。问题是,每次我通过 exec(query) 发送查询时,我都会收到一条错误消息,指出我的 QODBC driver 未加载。如果情况确实如此,那么我什至如何开始建立联系?更重要的是,我如何 re-write 我的代码或配置一些东西以便我的 driver 被加载?
填补空白的一些东西:
- 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
抱歉 wall-o-code 但我想确保你们都拥有所需的一切。
databaseconnection.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 参数不正确。即使我正确使用它,我的问题仍然存在,所以那里没有太大的进步,只是一些方便的花花公子学习。
我想通了! 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')
这对我来说似乎有点傻,但我确信这是有深思熟虑的理由的(如果你知道,一定要启发我!)。感谢那些帮助过我的人,就我而言,你已经回答了我的问题:)
旁注:错误报告对此完全是垃圾。驱动程序和数据库报告 "Drivers not loaded" 与发生的事情还差得很远。