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.