Название: Ошибка при запросе в 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 подключение, чтоб не париться... там проблем нет...
Значит, проблема была в драйвере мускуля, хотя вроде собиралось все норм.
|