2016-06-20 11 views
0

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.

+0

Haben Sie jemals tatsächlich die Verbindung geöffnet? – BJones

+0

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)? –

+0

@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. –

Antwort

0

Ich habe es herausgefunden! Die Dinge in VALUES benötigt, um in einfachen Anführungszeichen enthalten seine

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')

Was mir ein bisschen albern scheint, aber ich bin sicher, dass es ein gut durchdachter Grund dafür (wenn Sie es wissen, mit allen Mitteln aufklären mich!). Danke für die Hilfe, die das getan hat, es hat mich hierher gebracht, so weit es mich betrifft beantwortet Sie die Frage :)

Seitliche Anmerkung: Die Fehlerberichterstattung ist regelrecht Müll dafür. Sowohl die Treiber- als auch die Datenbankberichterstattung "Treiber nicht geladen" ist nicht annähernd vergleichbar mit dem, was gerade passiert ist.