我正在使用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 :(得分: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),等等上)。
如果你做设置它,它会按原样传递给驱动程序。