Версия для печати темы
Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Qt и mysql++ (ошибка сегментирования)
Автор: tin_gimranoff 19.10.2010, 17:28
Всем доброго времени суток. Помогите плз... пишу вот такой код:
void new_connect::on_CheckButton_clicked()
{
const char* HostName = this->ConvertToChar(ui->HostName->text());
const char* UserName = this->ConvertToChar(ui->UserName->text());
const char* UserPass = this->ConvertToChar(ui->UserPass->text());
int DataBasePort = ui->PortNumber->text().toInt();
mysqlpp::Connection test_connect;
if(!test_connect.connect("information_schema", HostName, UserName, UserPass, DataBasePort))
{
//код
}
else
{
//код
}
}
И когда дело доходит до этого события то проект вылетает вместе с QtCreator'ом с ошибкой сегментирования. Причём точно знаю что ошибку вызывает строка
if(!test_connect.connect("information_schema", HostName, UserName, UserPass, DataBasePort))Почему так происходит, объясните плз, и как это дело исправить?
Заранее СПС!!!!
Автор: Алексей1153 19.10.2010, 19:18
Цитата(tin_gimranoff @ 19.10.2010, 20:28)

проект вылетает вместе с QtCreator'ом
прям с креатором ? Сильно! Пиши разработчикам о глюке

а так если
if(!test_connect.connect("information_schema", ui->HostName->text(), ui->UserName->text(), ui->UserPass->text(), DataBasePort))
Автор: tin_gimranoff 19.10.2010, 22:37
Цитата(Алексей1153 @ 19.10.2010, 20:18)

Цитата(tin_gimranoff @ 19.10.2010, 20:28)

проект вылетает вместе с QtCreator'ом
прям с креатором ? Сильно! Пиши разработчикам о глюке

а так если
if(!test_connect.connect("information_schema", ui->HostName->text(), ui->UserName->text(), ui->UserPass->text(), DataBasePort))
А так он ругается вообще на несовместимость типов, т.к. connect требует в качестве аргументов const* char, а в QT объекты обрабатывают строки как я понимаю в QString
А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?
Автор: Алексей1153 20.10.2010, 6:02
tin_gimranoff, а ты уверен, что косяк именно в этом месте ? А вот сделай так (это исключает наличие ошибки в этом месте):
if(!test_connect.connect("information_schema", "localhost","имяюзера","парольюзера", DataBasePort))
Цитата(tin_gimranoff @ 20.10.2010, 1:37)

и законектиться к базе.
тип базы - ? От способ подключения к базе не зависит от языка программирования
Автор: BRE 20.10.2010, 7:10
Цитата(tin_gimranoff @ 19.10.2010, 23:37)

А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?
А документацию по Qt почитать не получилось? ... на тему "QtSql Module"
Автор: tin_gimranoff 20.10.2010, 10:16
[quote name='Алексей1153' date='20.10.2010, 7:02' post='41509']
tin_gimranoff, а ты уверен, что косяк именно в этом месте ? А вот сделай так (это исключает наличие ошибки в этом месте):
if(!test_connect.connect("information_schema", "localhost","имяюзера","парольюзера", DataBasePort))
Так пробовал работает. Но стоит вместо статических значений запихнуть переменные, вылетает, соответственно ошибка именно в этой строке.
Автор: Алексей1153 20.10.2010, 10:21
tin_gimranoff, это потому, что сохраняешь указатель на локальные данные
ошибка тут
const char* HostName = this->ConvertToChar(ui->HostName->text());
const char* UserName = this->ConvertToChar(ui->UserName->text());
const char* UserPass = this->ConvertToChar(ui->UserPass->text());
text() возвращает QString, созданный на стеке. Ты берёшь адрес начала данных. Затем, по выходу из функции объект убивается, а указатель указывает на невалидные данные - и где-то потом, в обработчике сообщения кто-то пытается получить доступ к этому мусору
тут выход такой:сделать
QString HostName
QString UserName
QString UserPass
членами класса (new_connect , например) . Можно даже в одну структурку их определить. Так решится проблема потери валидности данных
Автор: tin_gimranoff 20.10.2010, 10:27
Цитата(BRE @ 20.10.2010, 8:10)

Цитата(tin_gimranoff @ 19.10.2010, 23:37)

А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?
А документацию по Qt почитать не получилось? ... на тему "QtSql Module"
Спс, как раз вчера пересобрал Qt c поддержкой этого модуля. Просто первое что я нашёл это было MySQL++ и решил поюзать его.
Цитата(Алексей1153 @ 20.10.2010, 11:21)

tin_gimranoff, это потому, что сохраняешь указатель на локальные данные
ошибка тут
const char* HostName = this->ConvertToChar(ui->HostName->text());
const char* UserName = this->ConvertToChar(ui->UserName->text());
const char* UserPass = this->ConvertToChar(ui->UserPass->text());
text() возвращает QString, созданный на стеке. Ты берёшь адрес начала данных. Затем, по выходу из функции объект убивается, а указатель указывает на невалидные данные - и где-то потом, в обработчике сообщения кто-то пытается получить доступ к этому мусору
тут выход такой:сделать
QString HostName
QString UserName
QString UserPass
членами класса (new_connect , например) . Можно даже в одну структурку их определить. Так решится проблема потери валидности данных
Спс, сегодня попробую, если получится то буду юзаться всё же Mysql++ вместо QtSql
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)