我的数据库如何连接而不设置端口?
我正在使用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显然不是有效的端口,它是如何工作的?
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)等)需要的值。
如果你做设置它,它传递给驱动程序。
这很有道理。谢谢! – Firedragon 2012-07-27 08:42:34
我会怀疑,如果你没有明确地设置端口(或者将其设置为完全无效),QSqlDatabase.open()中的代码将使用数据库/驱动程序类型的默认已知端口号。要检查我的理论,您可以尝试更改数据库运行的端口,然后尝试再次运行代码。 – 2012-07-27 08:35:03