Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2009, 01:57
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию MySQL4 (DataSource+SQLConnection+SimpleDataSet+DBGrid) проблемы

Прога состоит из двух форм. На первой размещены все компоненты и непосредственно вся работа в ней проводится, вторая - чисто настройки для подключения к базе (сервер, база, пользователь, пароль - 4 едита и батон).

Настройки упорно подставляют рута с пустым паролем, вместо текста, забиваемого в соответствующие едиты(на забиваемые в едиты хост и название базы компоненты вроде реагируют адекватно), не пойму в чем дело... наверное неправильно работаю с их записью в компоненты SimpleDataSet и SQLConnection.
Знаю, можно через LoginPromt := true работать с пользователем и паролем, но не хочу так, хочу именно "вручную"

Форма1(MainForm):
Код:
...
procedure TMainForm.FormShow(Sender: TObject);
begin
  SettingsForm.ShowModal();
end;
...

Форма2(SettingsForm):
Код:
...
procedure TSettingsForm.ConnectBtnClick(Sender: TObject);
begin
  MainForm.SimpleDataSet1.Active := false;
  MainForm.SQLConnection1.Connected := false;
  MainForm.SimpleDataSet1.Connection.Params.Clear;
  MainForm.SQLConnection1.Params.Clear;
  MainForm.SQLConnection1.Params.Add('DriverName=MySQL');
  MainForm.SimpleDataSet1.Connection.Params.Add('DriverName=MySQL');  MainForm.SQLConnection1.Params.Add('HostName='+SettingsForm.ServerEdit.Text);  MainForm.SimpleDataSet1.Connection.Params.Add('HostName='+SettingsForm.ServerEdit.Text);  MainForm.SQLConnection1.Params.Add('DataBase='+SettingsForm.BaseEdit.Text);  MainForm.SimpleDataSet1.Connection.Params.Add('DataBase='+SettingsForm.BaseEdit.Text);  MainForm.SQLConnection1.Params.Add('User_Name='+SettingsForm.UserEdit.Text);    MainForm.SimpleDataSet1.Connection.Params.Add('User_Name='+SettingsForm.UserEdit.Text);
  MainForm.SQLConnection1.Params.Add('Password='+PassEdit.Text);
  MainForm.SimpleDataSet1.Connection.Params.Add('Password='+SettingsForm.PassEdit.Text);
  MainForm.SQLConnection1.Params.Add('BlobSize=-1');
  MainForm.SimpleDataSet1.Connection.Params.Add('BlobSize=-1');
  MainForm.SQLConnection1.Params.Add('ErrorResourceFile=');
  MainForm.SimpleDataSet1.Connection.Params.Add('ErrorResourceFile=');
  MainForm.SQLConnection1.Params.Add('LocaleCode=1251');
  MainForm.SimpleDataSet1.Connection.Params.Add('LocaleCode=1251');
  MainForm.SimpleDataSet1.Active := true;
 MainForm.SQLConnection1.Connected := true;
  SettingsForm.Close();
end;
...

На сколько я понял, параметры, заданные SimpleDataSet'у автоматически присваиваются SQLConnection'у, т.к. они "повязаны" , однако, т.к. ничего не работает у меня, то в коде всеравно дублирую, как видите изменение параметров в последний компонент тоже.

Вот еще имеется вторая проблема такая:
на главной форме есть едит и кнопка, для осуществления простого, примитивнейшего поиска по таблице базы. Но вот незадача, Мускул не понимает кириллицу, вводимую в этот едит, т.е. выдает ошибку:
Код:
Project Project1.exe raised exception class EDatabaseError with message 'Uncnown Column "тут юникодная абракадабра"' in 'where clause". Process stoped. Use Step or Run to continue.
База в кодировке cp1251, пишу на Borland Delphi 7.
Листинг:
Код:
...
procedure TMainForm.SearchBtnClick(Sender: TObject);
begin
  SimpleDataSet1.Active := false;
  SimpleDataSet1.DataSet.CommandText := 'SELECT * FROM tblname WHERE column1 LIKE '+SearchEdit.Text+' or column2 LIKE '+SearchEdit.Text+' or...';
  SimpleDataSet1.Active := true;
end;
...  

Прошу подсобить чем-нить более опытных товарищей!
Ответить с цитированием
  #2  
Старый 16.12.2009, 02:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Не устаю удивлятся изобретательности начинающих. Так организовать подключение к БД, надо было придумать.
2. Сообщение об ошибке вы дали - молодцом. Ну а сам запрос зачем порезали? Что я должен понять по многоточию?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 16.12.2009, 02:59
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
1. Не устаю удивлятся изобретательности начинающих. Так организовать подключение к БД, надо было придумать.
Да? А как надо, научите...
Дело в том, что с бд в дельфе еще ни разу не работал, проштудировал этот вопрос в гугле и пошел по наиболее тривиальному, очевидному, понятному мне и легкому, на мой взгляд, пути. Да, может быть не как некоторые, привыкшие товарищи, через адо или бде работают, или вобще через доп. компоненты навроде зеосдб. Способов то работы с базой куча... и я избрал не самый плохой из них, или не так?

Цитата:
Сообщение от Страдалецъ
2. Сообщение об ошибке вы дали - молодцом. Ну а сам запрос зачем порезали? Что я должен понять по многоточию?

Извиняюсь, если непонятно истолковал, по многоточию, имелось ввиду, что поиск ведется по всем столбцам таблицы, предположим у меня 5 столбцов, тогда вот так:
Код:
...
procedure TMainForm.SearchBtnClick(Sender: TObject);
begin
  SimpleDataSet1.Active := false;
  SimpleDataSet1.DataSet.CommandText := 'SELECT * FROM tblname WHERE column1 LIKE '+SearchEdit.Text+' or column2 LIKE '+SearchEdit.Text+' or column3 LIKE '+SearchEdit.Text+' or column4 LIKE '+SearchEdit.Text+' or column5 LIKE '+SearchEdit.Text+;
  SimpleDataSet1.Active := true;
end;
...  
Ответить с цитированием
  #4  
Старый 16.12.2009, 08:22
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

При работе с текстовыми полями в запросе их необходимо обрамлять а кавычки, иначе искать будет неправильно. Например:
Код:
select * from MyTable where Column like Иванов
- вызовет ошибку, как в вашем случае.
а вот
Код:
select * from MyTable where Column like 'Иванов%'
- выдаст результат.
Для простоты рекомендую воспользоваться функцией QuotedStr:
Код:
SimpleDataSet1.DataSet.CommandText := 'SELECT * FROM tblname WHERE column1 LIKE '+QuotedStr(SearchEdit.Text)+...
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 16.12.2009, 13:52
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Спасибо, помогло!
Если сделать так:
Код:
 
SimpleDataSet1.DataSet.CommandText := 'SELECT * FROM tblname WHERE column1 LIKE '''+SearchEdit.Text+'''...
или так:
Код:
SimpleDataSet1.DataSet.CommandText := 'SELECT * FROM tblname WHERE column1 LIKE '+QuotedStr(SearchEdit.Text)+'...
То работает безотказно! Знал - что-то элементарное пропустил.

Вот теперь бы еще с этим рутом разобраться... такое ощущение, что в каком-то компоненте просто стоит сойство: беспарольный_авторут := true
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter