Russian Qt Forum

Qt => Базы данных => Тема начата: Danila_Bagrofff от Декабрь 20, 2010, 12:13



Название: Ошибка при запросе в MySQL
Отправлено: Danila_Bagrofff от Декабрь 20, 2010, 12:13
Есть задача переноса данных с MySQL в MSSQL.
Программа рушится.
С помощью дебаггера креатор нашел ошибку в месте query.exec(). При дебаггинге возникает вот такая ошибка:
Цитировать
(Internal error: pc 0x10a in read in psymtab, but not in symtab.)

Код:
int Query::singleSelect(
        QString SQLString,
        QString &string
        )
{
    if(isConnect()<0)
        return ERROR_OPEN_DB;

    lastError = "";
    string = "";
    QSqlQuery query(db); //база открывается без проблем
    if(!query.exec(SQLString))  //ошибка возникает здесь
   {
        lastError = query.lastError().text();
        return ERROR;
    }

    int count=0;
    while (query.next())
    {
       string = query.value(0).toString();
       count++;
   }

    if(count>1)
    {
       lastError = tr("Ошибка! Множественное вхождение элемента!");
       return ERROR_COUNT;
    }

    if(string=="")
        return ERROR;

    return ERROR_NO;
}

При таком же запросе к MSSQL проблем нет, а при обращении к MySQL возникает проблема, при этом соединяется без проблем, никаких ошибок, но вот на самом запросе вылетает.

Что может быть не так, что нужно сделать?


Название: Re: Ошибка при запросе в MySQL
Отправлено: Пантер от Декабрь 20, 2010, 12:57
А что за запрос? Покажи как вызываешь эту функцию.


Название: Re: Ошибка при запросе в MySQL
Отправлено: Danila_Bagrofff от Декабрь 20, 2010, 13:57
syntax error вроде не выдает, запрос тестовый в heidi обрабатывается без проблем. любой запрос не проходит.

Код:
archive = new ArchiveAPI("QMYSQL", "Archive");
//конструктор по умлочанию
ArchiveAPI::ArchiveAPI(
                QString typeConnection,     //тип соединения
                QString nameConnection      //имя соединения
                )
{
    lastError = "";
    this->nameConnection = nameConnection;
    sqlDBArchive = new Query(typeConnection, nameConnection);
}

ArchiveAPI::~ArchiveAPI()
{
    QSqlDatabase::removeDatabase(nameConnection);
}

//Создает соединение с БД
//возвращает код ошибок
int ArchiveAPI::createConnection(
                    QString serverName,         //имя сервера
                    QString dataBaseName,       //имя БД
                    QString userName,           //имя пользователя
                    QString Password            //пароль
                    )
{
    sqlDBArchive->createConnection(serverName, dataBaseName, userName, Password);

    return sqlDBArchive->isConnect();
}

int ArchiveAPI::getAbonent(QString &abonent)
{
    SQLString = "SELECT * from arch_abonents where id = 1";

    int err = sqlDBArchive->singleSelect(SQLString, abonent);
    if(err<0)
        return err;

    return ERROR_NO;
}

Query::Query(
        QString typeConnection,
        QString nameConnection
             )
{
    lastError = "";
    this->nameConnection = nameConnection;
    this->typeConnection = typeConnection;
    QSqlDatabase::addDatabase(typeConnection, nameConnection);
}

int Query::createConnection(
        QString serverName,
        QString dataBaseName,
        QString userName,
        QString Password
        )
{
    lastError = "";
    QString SQLString = "";
    QSqlDatabase db = QSqlDatabase::database(nameConnection);
    if(typeConnection == "QODBC")
    {

        SQLString = "DRIVER={SQL Server};Server="+ serverName + ";APP=Enterprise Suite;DATABASE="+ dataBaseName +";Network=DBMSSOCN";
        db.setDatabaseName(SQLString);
    }
    else
    {
        db.setHostName(serverName);
        db.setDatabaseName(dataBaseName);
        //dbArchive.setUserName("Kalinin");
        //dbArchive.setPassword("123");
    }

    if(!db.open(userName, Password))
    {
        lastError = db.lastError().text() + " "  + SQLString;
        return ERROR_OPEN_DB;
    }

    if(!isConnect())
    {
        lastError = db.lastError().text() + " "  + SQLString;
        return ERROR_OPEN_DB;
    }

    return ERROR_NO;
}


int Query::isConnect()
{
    QSqlDatabase db = QSqlDatabase::database(nameConnection);
    lastError = "";
    if (!db.isOpen())
    {
        lastError = tr("Cоедиенение ")+ nameConnection + tr(" не открыто!");
        return ERROR_OPEN_DB;
    }

    return ERROR_NO;
}

int Query::singleSelect(
        QString SQLString,
        QString &string
        )
{
    if(isConnect()<0)
        return ERROR_OPEN_DB;

    QSqlDatabase db = QSqlDatabase::database(nameConnection);
    lastError = "";
    string = "";
    QSqlQuery query(db);
    if(!query.exec(SQLString))
    //if(err==false)
    {
        lastError = query.lastError().text();
        return ERROR;
    }

   int count=0;
    while (query.next())
    {
       string = query.value(0).toString();
       count++;
       //doSomething(string);
    }

    if(count>1)
    {
       lastError = tr("Ошибка! Множественное вхождение элемента!");
       return ERROR_COUNT;
    }

    if(string=="")
        return ERROR;

    return ERROR_NO;
}


чуть подправил класс запроса. чтобы db вызывалосб по указаниям кутэшников.


Название: Re: Ошибка при запросе в MySQL
Отправлено: Danila_Bagrofff от Декабрь 20, 2010, 17:22
хм, запрос типа select * from arch не проходит

максимум 2 поля... то есть: select id, name from arch выполняется, а вот запрос select id, name, type from arch уже вылетает..

Кто-то сталкивался с подобной проблемой?


Название: Re: Ошибка при запросе в MySQL
Отправлено: Danila_Bagrofff от Декабрь 21, 2010, 16:31
На проблему плюнул и не стал использовать QMYSQL а перешел на QODBC подключение, чтоб не париться... там проблем нет...

Значит, проблема была в драйвере мускуля, хотя вроде собиралось все норм.