• 6959阅读
  • 2回复

有人在Win下用QODBC连过 sql server 2008 Express吗? [复制链接]

上一主题 下一主题
离线csoapy
 

只看楼主 倒序阅读 楼主  发表于: 2010-04-01
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
QT连SQL数据库容易让人迷惑的就是QSqlDatabase::setDatabaseName();说是设置数据库的名字,其实连sql server时用的连接字符串也可以……
不知这样理解对不?

以前在linux下用QT + unixODBC连过 sql server 2005的企业版, 这样就可以了
  1.     QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "MainDBConnection");
  2.     db.setDatabaseName("master");
  3.     db.setHostName(“192.168.1.100”);
  4.     db.setPort(1433);
  5.     db.setUserName("sa");
  6.     db.setPassword("123");
  7.     db.setConnectOptions("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3");


现在把代码照搬过来,不行。
然后
  1.     QString error;
  2.     QString conn = "Data Source=.\\SQLEXPRESS;Initial Catalog=master;Integrated Security=False;Persist Security Info=False;"
  3.                    "User ID=sa;password=[]";
  4.     QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "MainDBConnection");
  5.     db.setDatabaseName(conn);
  6.     db.setUserName("sa");
  7.     db.setPassword("[]");
  8.     if (!db.open())
  9.         error = db.lastError().text();

报错:" [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 QODBC3: Unable to connect"
注意这里的conn可是我在C#中试过了的,可以用。
也不是QT驱动的问题,QSqlDatabase::drivers()返回:QSQLITE, QODBC3, QODBC。
然后又照网上的种种方法试了又试,还是不行。NND,都快两天了,连个数据库都还没连上……
离线hehui

只看该作者 1楼 发表于: 2010-04-03
我的部分代码:




QSqlError DatabaseUtility::openRemoteDatabase(const QString &connectionName, const QString &driver,
            const QString &host, int port, const QString &user, const QString &passwd, const QString &databaseName, HEHUI::DatabaseType databaseType)
{


    QSqlError err ;


    QSqlDatabase db;

    if(databaseType == HEHUI::M$SQLSERVER && OS_IS_WINDOWS ){
        db = QSqlDatabase::addDatabase("QODBC", connectionName);
        db.setDatabaseName(
                QString("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4")
                .arg(host.trimmed())
                .arg(databaseName.trimmed())
                .arg(user.trimmed())
                .arg(passwd.trimmed())
                );
        db.open();

    }else{
    db = QSqlDatabase::addDatabase(driver, connectionName);
    db.setDatabaseName(databaseName);
    db.setHostName(host);
    db.setPort(port);
    db.open(user, passwd);

    }



    if (!db.isOpen()) {
        err = db.lastError();
        db = QSqlDatabase();
        QSqlDatabase::removeDatabase(connectionName);
        qCritical()<< QString("Database '%1' open failed!").arg(databaseName);
        qCritical()<< QString("An error occurred when opening the database: %1").arg(err.text());
    }
    qDebug()<< QString("----DatabaseUtility::openRemoteDatabase(...)~~Database connection %1 is %2").arg(connectionName).arg(db.isValid() ? "Valid" : "Invalid");

    return err;

}



离线hehui

只看该作者 2楼 发表于: 2010-04-03
setDatabaseName(QString("DRIVER={SQL Server};SERVER=192.168.1.1;DATABASE=myDB;UID=sa;PWD=password"))



这是Windows下的关键!!!!!!!!!!!!!

Linux下用UnixODBC和FreeTDS连接!
快速回复
限100 字节
 
上一个 下一个