2012-07-27 4 views
1

저는 (지금까지는 PostgreSQL과 mySQL을 사용하여) 데이터베이스에 연결하기 위해 Qt를 사용하고 있으며, 포트가 어떻게 작동하는지 혼란 스럽습니다. 그게 차이를 만드는 경우 우분투를 사용하고 있습니다.포트를 설정하지 않고 데이터베이스를 어떻게 연결합니까?

여기 설명서에 따르면 http://doc.qt.nokia.com/4.8-snapshot/qsqldatabase.html#setPort에는 포트의 기본값이 없습니다. 그러나 나는 포트 설정을하지 않았지만 여전히 문제없이 연결하고 있다는 것을 설정에서 알게되었습니다. db.setPort(-1); 또는 내가 사용 기대로 :

작동
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("mydb"); 
db.setUserName("name"); 
db.setPassword("pass"); 

내가 이렇게하면

또한 작동 (나도 MySQL의 드라이버를 시도) :

그래서 나는 이렇게 설정 한 기본 포트 : db.setPort(5432);

그러나 예상대로 다른 포트가 작동하지 않습니다. 따라서 기본 포트 값이 없으며 -1은 분명히 유효한 포트가 아님을 감안할 때 어떻게 작동합니까?

+0

포트를 명시 적으로 설정하지 않거나 완전히 무효로 설정하면 QSqlDatabase.open()의 코드가 데이터베이스/드라이버 유형의 기본 포트 번호를 사용하게됩니다. 내 이론을 확인하기 위해 DB가 실행중인 포트를 변경 한 다음 코드를 다시 실행하려고 시도 할 수 있습니다. –

답변

1

Qt 자체는 기본 포트 값을 제공하지 않지만 개별 드라이버는 제공 할 수 있습니다. Qt를 통해 open을 호출하면 간단히 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 용 드라이버 코드 -1의 값 0로 번역되는 것을 의미 mysql_real_connect()에 포트 파라미터로서 (port > -1) ? port : 0 통과 :

예를 들어 위해 Postgress 드라이버 코드는 다음 open 함수를 포함 . 그리고 어떤 MySQL 코더가 알려주 듯이, mysql_real_connect()에 기본 포트를 사용하도록 알려줍니다.

즉, 포트는 QT- 일반 기본값 인 -1에서 적합한 드라이버 (예 : MySQL의 경우 3306, DB2의 경우 50000 (60000) 등)로 필요한 모든 드라이버로 변환됩니다.

을 설정하면을 설정하면 그대로 드라이버로 전달됩니다.

+0

많은 의미가 있습니다. 고맙습니다! – Firedragon

관련 문제