Titel sagt die meisten von dem, was vor sich geht. Ich kann bestätigen, dass ich mich mit der Datenbank verbinde, und ich öffne definitiv die Verbindung, bevor ich versuche, eine Frage zu stellen. Das Problem ist, jedes Mal, wenn ich die Abfrage über exec (Abfrage) sende, erhalte ich eine Fehlermeldung, dass mein QODBC-Treiber nicht geladen ist. Wenn das wirklich der Fall ist, wie bekomme ich dann überhaupt eine Verbindung? Und noch wichtiger: Wie schreibe ich meinen Code neu oder konfiguriere etwas, damit meine Treiber geladen werden?QODBC verbindet sich mit dem SQL-Server, kann aber keine Abfragen ausführen
- popupwindows.h ist, was AlertWindow, ErrorWindow steuert, und Erfolg Fenster und wirkt sich nicht auf etwas hier überhaupt:
Manches in die Lücken zu füllen.
- Ich erhalte alle Konstanten und Daten ganz gut, es ist also nichts, wie ich die Zusammenstellung Abfrage meiner SQL, Beispiel:
INSERT INTO RegTable (project_id, Project_Name, Zyklus, Anzahl , B1, B2, B3, Horiz, Vert, Skew) VALUES (117,001, ZT400-300DPI, 0, 1, 1, 2, 3, 4, 5, 6)
ich bin immer wahr Werte für db.isOpen() und db.isValid(), wenn ich die Funktion sendData() starte, obwohl ich sie herausnahm, sobald ich Fehler mit ausgeschlossen habe was sie prüften.
Ich habe qsqlodbc.dll und qsqlodbcd.dll in mehreren Ordnern in meinem Anwendungsverzeichnis, aber vor allem in
C:\path\to\built\project\debug\sqldrivers
Sorry für den Wand-o-Code, aber ich wollte sicherstellen, Sie hatten alles, was Sie brauchten.
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));
}
}
}
}
}
bearbeiten 6/21/16 - Ich habe etwas mehr Forschung getan und fand heraus, dass ich die DSN-Parameter falsch verwendet hat. Mein Problem steht immer noch, auch wenn ich es richtig benutze, also keine allzu großen Fortschritte, nur ein paar handliche Dandy-Lernspiele.
Haben Sie jemals tatsächlich die Verbindung geöffnet? – BJones
Wenn Sie 'db.exec (QString (" USE "+ Datenbank)) ändern;' um auch 'QSqlQuery' zu verwenden, liegt der Fehler bereits in dieser Zeile? Wenn ich mich richtig erinnere, brauchen Sie die 'USE $ DB' überhaupt nicht, da diese bereits in der Verbindungszeichenfolge definiert ist. Möchten Sie mit einer Verbindung versuchen, ohne den DSN zu verwenden, nur um zu verdeutlichen, dass während der Verbindung kein unbekanntes Problem vorliegt (siehe https://wiki.qt.io/ODBC)? –
@SebastianLange, ich tat, wie Sie vorgeschlagen und das Ergebnis eines QSqlQuery-Objekts für '" USE "+ Datenbank" überprüft und es wurde kein Fehler ausgelöst, so denke ich, dass es einige Befehle korrekt empfängt. Leider macht das ein bisschen verwirrend, haha. Ich habe auch den DSN entfernt (was eigentlich ist, wie ich das gestartet habe, ohne einen), und derselbe "Treiber nicht geladener Treiber nicht geladen" Fehler kommt zurück. –