如果没有设置端口,我的数据库如何连接?

时间:2012-07-27 08:09:08

标签: database qt

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

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

如果你设置它,它会按原样传递给驱动程序。