代码之家  ›  专栏  ›  技术社区  ›  امير طارق

通过QT C连接到SQL server 2005++

  •  1
  • امير طارق  · 技术社区  · 13 年前

    我有一个windows服务器2003的服务器,它在我的本地网络上的IP是192.168.1.220 此服务器已安装SOL server 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进行连接

    那么这里出了什么问题?以及是否存在使用qt c++而不是ODBC驱动程序连接SQL服务器的其他禁食方式。

    1 回复  |  直到 13 年前
        1
  •  1
  •   Cameron Tinker    13 年前

    您需要在服务器上设置一个数据源名称,以便通过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的代码。它以标准用户而不是root用户的身份运行,因此所有操作都在本地用户帐户中完成。