1

Windows Server 2003 のサーバーがあり、ローカル ネットワーク上の IP は 192.168.1.220 です。このサーバーには SOL サーバー 2005 Express Edition がインストールされています。この SQL サーバーには、amir というデータベースがあります。

同じネットワーク上の Linux クライアントから接続したい。サーバーでポート1617を使用するSQLサーバーサービスで、このポートを使用してJavaを使用してサーバーに接続しました。

QT C++ を使用したいのですが、コードが機能しません。

これは私のコードです:

#include <QtCore/QCoreApplication>
#include <iostream>
#include <QSqldatabase>
#include <QSqldriver>
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
   bool test=db.isValid();//true
   test=db.isDriverAvailable("QODBC");//true
   db.setHostName("192.168.1.220\\SQLEXPRESS");
   db.setDatabaseName("DRIVER={SQL Server};SERVER=192.168.1.220\\SQLEXPRESS:1617;DATABASE=amir");
   db.setUserName("sa");
   db.setPassword("amir");
   db.setPort(1617);
   test=db.isValid();//true
   if(!db.open())
   {
      cout<<endl<<"not connected"<<endl;
      QString error=db.lastError().text();
      cout<<error.toLocal8Bit().data();
      return false;
   }
   else
      cout<<endl<<"connected"<<endl;
      return true;
 }

これを試すたびに「接続されていません」とエラーが表示されます

[unixODBC][Driver Manager]データ ソース名が見つからず、デフォルト ドライバが指定されていません QODBC3: 接続できません

これらのパラメーターを使用して、Java を使用して接続できます

それで、ここで何が間違っているのですか?また、ODBC ドライバー以外に、qt c++ を使用して SQL サーバーに接続する別の高速な方法がある場合。

4

1 に答える 1

1

ODBCを介して接続するには、サーバーにデータソース名を設定する必要があります。これは、DSNをセットアップするために使用するコードです。

QString SQLServerProvider::buildDSN(QString server, QString database, QString username, QString password)
{
#ifdef Q_WS_MACX
    QString dsn = QString("DRIVER=/usr/local/lib/libtdsodbc.so;SERVER=%1;TDS_VERSION=8pClient;DATABASE=%2;PORT=1433;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif

#ifdef Q_WS_X11
    QString dsn = QString("DRIVER={FreeTDS};SERVER=%1;TDS_VERSION=8.0;PORT=1433;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif

#ifdef Q_WS_WIN
    QString dsn = QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif
    return dsn;
}
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", databaseName);
db.setDatabaseName(buildDSN(server, database, username, password));

これが私が最初の投稿に入れるのを忘れたいくつかのコードです:

    #ifdef Q_WS_X11
    QString dir = QDir::homePath();
    QDir d;
    QString libdir = d.absolutePath();

    QFile odbcinst(dir + "/.odbcinst.ini");
    if(!odbcinst.exists())
    {
        odbcinst.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&odbcinst);
        out << "[FreeTDS]\n";
        out << "Description = v0.91 with protocol v8.0\n";
        out << "Driver = " + libdir + "/libtdsodbc.so\n";
        out << "Setup = " + libdir + "/libtdsodbc.so\n";
        out << "FileUsage = 1";
        odbcinst.close();
    }
    else
    {
        QList<QString> lines;

        odbcinst.open(QIODevice::ReadOnly | QIODevice::Text);
        QTextStream readfile(&odbcinst);

        int i = 0, lnbr = 0;
        bool found = false;
        while(!readfile.atEnd())
        {
            QString line = readfile.readLine();
            if(line.contains("[FreeTDS]"))
            {
                lnbr = i;
                found = true;
            }
            lines.append(line);
            i++;
        }
        odbcinst.close();

        // append to end
        if(!found)
        {
            // append to the end
            odbcinst.open(QIODevice::Append | QIODevice::Text);
            QTextStream file(&odbcinst);

            file << "\n[FreeTDS]\n";
            file << "Description = v0.91 with protocol v8.0\n";
            file << "Driver = " + libdir + "/libtdsodbc.so\n";
            file << "Setup = " + libdir + "/libtdsodbc.so\n";
            file << "FileUsage = 1";
            odbcinst.close();
        }
        else // update existing entry
        {
            qDebug() << "Found an entry for FreeTDS. Updating driver to " + libdir + "/libtdsodbc.so.";
            qDebug() << lines[lnbr+2];
            qDebug() << lines[lnbr+3];

            lines.replace(lnbr + 2, "Driver = " + libdir + "/libtdsodbc.so");
            lines.replace(lnbr + 3, "Setup = " + libdir + "/libtdsodbc.so");

            QString text;
            for(int j = 0; j < lines.count(); j++)
            {
                text.append(lines[j] + "\n");
            }

            odbcinst.open(QIODevice::WriteOnly | QIODevice::Text);
            QTextStream updatefile(&odbcinst);
            updatefile << text;
            odbcinst.close();
        }

    }
#endif

このコードは、ホームディレクトリに.odbcinst.iniファイルが存在しない場合はそれを作成し、FreeTDSのエントリを追加します。存在する場合は、ファイルの最後に追加されます。FreeTDSのエントリがファイルにすでに存在する場合は、既存のファイルが更新されます。FreeTDSをまだ設定していない場合は、次のガイドをご覧ください:http: //pzuk.wordpress.com/2012/02/03/how-to-make-freetds-unixodbc-and-qt-working-together/

私が投稿したFreeTDSを構成するためのコードは、FreeTDSをアプリケーションにバンドルし、起動した場所からライブラリパスを正しく設定する場合にのみ必要であることに注意してください。ルートとしてではなく標準ユーザーとして実行されるため、すべてがローカルユーザーアカウントで実行されます。

于 2012-09-30T17:57:35.647 に答える