2012-07-27 21 views
1

我正在使用Qt连接数据库(到目前为止使用PostgreSQL和MySQL),并且对端口的工作方式有点困惑。如果这有所帮助,我正在使用Ubuntu。我的数据库如何连接而不设置端口?

根据此处的文档:http://doc.qt.nokia.com/4.8-snapshot/qsqldatabase.html#setPort端口没有默认值。不过,我注意到我的设置,我实际上并没有设置端口,但它仍然没有问题连接。

所以我把它设置了这样的:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("mydb"); 
db.setUserName("name"); 
db.setPassword("pass"); 

其中一期工程(我曾尝试与MySQL驱动程序太)

它还如果我这样做的工作:db.setPort(-1);或为我所期望的使用默认端口:db.setPort(5432);

但其他端口不工作,这是预期的。所以,鉴于它表示没有默认的端口值,-1显然不是有效的端口,它是如何工作的?

+0

我会怀疑,如果你没有明确地设置端口(或者将其设置为完全无效),QSqlDatabase.open()中的代码将使用数据库/驱动程序类型的默认已知端口号。要检查我的理论,您可以尝试更改数据库运行的端口,然后尝试再次运行代码。 – 2012-07-27 08:35:03

回答

1

Qt本身可能不提供默认的端口值,但个别驱动程序。当您通过Qt open时,它只会调用驱动程序特定代码的open

例如,Postgress驱动程序代码包含以下open功能:

bool QPSQLDriver::open(const QString & db, const QString & user, 
    const QString & password, const QString & host, 
    int port, const QString& connOpts) 
{ 
    if (isOpen()) close(); 

    QString conn; 

    if (!host.isEmpty()) 
    conn.append(QLatin1String("host=")).append(qQuote(host)); 
    : 
    if (port != -1) 
    conn.append(QLatin1String(" port=")).append(qQuote(QString::number(port))); 
    : 
    d->connection = PQconnectdb(conn.toLocal8Bit().constData()); 
    : 
    return true; 
} 

同样,MySQL的驱动程序代码传递(port > -1) ? port : 0作为端口参数mysql_real_connect(),这意味着的-1的值被翻译为0 。而且,正如任何MySQL编码器会告诉你的,通知mysql_real_connect()使用默认端口。

换言之,端口从QT通用默认值-1转换为特定驱动程序作为合适默认值(例如MySQL的3306,DB2的50000(或60000)等)需要的值。

如果你设置它,它传递给驱动程序。

+0

这很有道理。谢谢! – Firedragon 2012-07-27 08:42:34

相关问题