0

我正在尝试连接到远程SQL服务器:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
    db.setDatabaseName(QString("Driver={SQL Server Native Client 10.0};Server=X.X.X.X;Database=/*DB*/;"));
    db.setUserName("sa");
    db.setPassword("/*password*/");

    if (!db.open()) {
        qDebug() << db.lastError().text();
    }
    else
    {
        qDebug() << "connected";
    }

但大约 7 秒后,它给了我这个日志:

[Microsoft][SQL Server Native Client 10.0]命名管道提供程序:无法打开到 SQL Server [1326] 的连接。[Microsoft][SQL Server Native Client 10.0]建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。[Microsoft][SQL Server Native Client 10.0]Login timeout expired QODBC3: Unable to connect

但是服务器已启动并正在运行,并且连接正常并且已经使用UDL文件进行了测试。

注意:本地连接效果很好

4

1 回答 1

3

使用这些设置,拥有用户并传入 dbname,请:

QString connectString = "Driver={SQL Server Native Client 10.0};"; // Driver can also be {SQL Server Native Client 11.0}
connectString.append("Server=SERVERHOSTNAME\\SQLINSTANCENAME;");   // Hostname,SQL-Server Instance
connectString.append("Database=SQLDBSCHEMA;");  // Schema
connectString.append("Uid=SQLUSER;");           // User
connectString.append("Pwd=SQLPASS;");           // Pass
db.setDatabaseName(connectString);
if(db.open())
{
    ui->statusBar->showMessage("Connected");
}else{
    ui->statusBar->showMessage("Not Connected");
}

或不使用完整的 DSN

QString connectString = "Driver={SQL Server};"; // Driver is now {SQL Server}
connectString.append("Server=10.1.1.15,5171;"); // IP,Port
connectString.append("Database=SQLDBSCHEMA;");  // Schema
connectString.append("Uid=SQLUSER;");           // User
connectString.append("Pwd=SQLPASS;");           // Pass
db.setDatabaseName(connectString);
if(db.open())
{
    ui->statusBar->showMessage("Connected");
}else{
    ui->statusBar->showMessage("Not Connected");
}

拥有基于 ip/port 的连接的重要一点是在服务器配置中启用这种类型的连接。默认一个不能直接使用 ip/port 连接。

来自https://wiki.qt.io/ODBC

于 2016-10-07T08:20:54.097 回答