我正在使用 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 本身可能不提供默认端口值,但各个驱动程序会提供。当你 open
通过 Qt,它只是调用 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)等)。
如果您确实设置了它,它就会按原样传递给驱动程序。
关于database - 我的数据库如何在不设置端口的情况下连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683897/