2012-07-27 20 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

相關問題