Brak danych pochodzących z bazy danych

0

Próbuję napisać w Qt aplikację bazodanową współpracującą MS SQL. Poprzednio zainstalowałem w Windows sterownik ODBC dla PostgreSQL i był ten sam problem.

System to Windows XP 32bit i Windows 7 64bit.

Poniżej testowy kod napisany na podstawie informacji znalezionych w Internecie.

Problem polega na tym, że połączenie następuje, zapytanie jest wykonywane, informacja o tabeli (nazwy kolumn i liczba krotek) jest poprawnie pobierana, ale danych nie ma, wygląda tak, jakby zamiast danych wszędzie był null.

Gdzie jest błąd?

Parametry w connectionstring zostały celowo zmienione.

Po drugie, nie widzę związku między zapytaniem (obiekt klasy QSqlQuery), a połączeniem (obiekt klasy QSqlDatabase). Skąd program wie, gdzie ma wysłać podane zapytanie SQL? Jak to rozwiązać, jak jest otwartych kilka połączeń?

    QString ConnStr = "Driver={SQL Server};Server=AAA;Database=BBB;Uid=CCC;Pwd=DDD;";
    QSqlDatabase Db;
    Db = QSqlDatabase::addDatabase("QODBC");
    Db.setDatabaseName(ConnStr);
    if (Db.open())
    {
    }
    else
    {
        QSqlError d = Db.lastError();
        ui->TestOut->setPlainText(d.text());
    }
    QSqlQuery C;
    QString SqlQuery = "select nr, opis from Zapas";
    C.prepare(SqlQuery);
    QString S = "";
    if (C.exec())
    {
        S = "@\r\n";
    }
    QSqlRecord R = C.record();
    S = S + R.fieldName(0) + "|";
    S = S + R.fieldName(1) + "|\r\n";
    while (C.next())
    {
        if (R.isNull(0))
        {
            S = S + "NULL";
        }
        else
        {
            S = S + R.value(0).toString();
        }
        S = S + "\r\n";
    }
    ui->TestOut->setPlainText(S);
    Db.close();

Na wyjściu jest taki tekst

@
numer|opis|
NULL
NULL
NULL
NULL
NULL

Świadczy to o tym, że pobrał strukturę tabeli i pobrał wszystkie jej krotki. Tylko nie pobrał danych. Ilość wystąpień NULL zgadza się z ilością krotek w tabeli.

0
andrzejlisek napisał(a):

Po drugie, nie widzę związku między zapytaniem (obiekt klasy QSqlQuery), a połączeniem (obiekt klasy QSqlDatabase). Skąd program wie, gdzie ma wysłać podane zapytanie SQL? Jak to rozwiązać, jak jest otwartych kilka połączeń?

Tworząc QSqlQuery podaj jako argument połączenie do bazy: QSqlQuery ( QSqlDatabase db )

0
kotlar napisał(a):
andrzejlisek napisał(a):

Po drugie, nie widzę związku między zapytaniem (obiekt klasy QSqlQuery), a połączeniem (obiekt klasy QSqlDatabase). Skąd program wie, gdzie ma wysłać podane zapytanie SQL? Jak to rozwiązać, jak jest otwartych kilka połączeń?

Tworząc QSqlQuery podaj jako argument połączenie do bazy: QSqlQuery ( QSqlDatabase db )

OK, sprawdziłem i tak można, ale nadal pozostał główny problem z danymi.

Co ciekawe, w .NET sprawdziłem połączenie przez ODBC, ten sam connectionstring i to samo zapytanie i w zwracanych polach normalnie są dane, więc nie wiem, czemu Qt nie umie odczytać danych. Testowałem z kolumnami typu varchar i typu int i nic nie odczytał.

0

następna sprawa to:

while ( C.next() )
{
QSqlRecord R = C.record();
S = S + R.value(0).toString();
}

0
kotlar napisał(a):

następna sprawa to:

while ( C.next() )
{
QSqlRecord R = C.record();
S = S + R.value(0).toString();
}

Teraz zadziałało, dziękuję bardzo. Widocznie przykłady, na które trafiałem szukając o własnych siłach były wadliwe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1