2

我正在使用 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 显然不是有效端口,它是如何工作的?

4

1 回答 1

2

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)等等)。

如果您确实设置了它,它会按原样传递给驱动程序。

于 2012-07-27T08:35:41.567 回答