Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re:

Сообщение GAMER » 07.08.2008 17:36:41

Vadim писал(а):nefarious
У Вас типичная и широкораспрстранённая ошибка.
В FAQ следует добавить не это конкретное, а вот что:
Если запрс должен возвратить набор данны, например "SELECT поле1, поле2 FROM таблица", "SHOW ..." то его выполнение нужно делать с помощью метода Open.
Если запрос не возвращает набор данных, например "UPDATE ...", "INSERER ...", "SET ..." и т.п., то его выполнение нужно делать с помощью метода ExecSQL.



А если нужно сделать програмку которая бы имела Мемо и Грид. При этом в мемо юзер вводит запрос (любой), и если запрос возвращает результат-таблицу, то она выводится в грид, а если запрос типа "UPDATE ...", "INSERER ...", "SET ...", то просто выводится сообщение. Как с методами то быть?

PS. Я работаю с MySQL через libMySL.dll напрямую, не использую никаких компонент.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение Vadim » 10.08.2008 10:53:49

GAMER писал(а):Как с методами то быть?

Вопрос не понял.
Если Вы работаете не через компоненты, а через DLL, то тип запроса Вас вообще волновать не должен, т.к. там для всех запросов используется одна и та же функция.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение GAMER » 10.08.2008 11:33:11

Vadim писал(а):
GAMER писал(а):Как с методами то быть?

Вопрос не понял.
Если Вы работаете не через компоненты, а через DLL, то тип запроса Вас вообще волновать не должен, т.к. там для всех запросов используется одна и та же функция.


Прошу прощения, намудрил с вопросом.
Имел в виду, как анализировать тип запроса, если использовать методы Open и ExecSQL. А приписку написал для того, чтобы показать, как это обойти, если работать напрямую, через dll.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение Vadim » 10.08.2008 17:22:59

GAMER
Ну, проанализировать можно по первому слову в запросе. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение GAMER » 10.08.2008 20:28:42

Vadim писал(а):GAMER
Ну, проанализировать можно по первому слову в запросе. :)

Можно, но вообще то этим должен заниматься сервер, а не клиент.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение Vadim » 11.08.2008 03:50:10

GAMER писал(а):...но вообще то этим должен заниматься сервер, а не клиент.

Тогда определитесь сначала, про что говорите Вы - про сервер или про клиент. Вы пока что говорили именно про клиент. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение GAMER » 11.08.2008 10:53:36

Vadim писал(а):
GAMER писал(а):...но вообще то этим должен заниматься сервер, а не клиент.

Тогда определитесь сначала, про что говорите Вы - про сервер или про клиент. Вы пока что говорили именно про клиент. :)

Говорил о клиенте.
Вообщем к чему это я все веду:
К тому, что используя компоненты для работы с MySQL, при определенных задачах, клиенту нужно заниматься не свойственным ему делом - делать анализ синтаксиса запроса. А если в какой -то версии появится новый тип запроса? Тогда нужно вносить изменения в код.
Грубо говоря - критикую компоненты для работы с MySQL, рекламирую работу напрямую через библиотеку libmysql.dll (so). :D
PS. Хотя есть определенные приколы и при работе напрямую. Я, например, никак не могу понять, почему в коде:
Function MySQLConnect(Var VMySock : PMYSQL; Const Host, MyUser, Password: PChar; Var MySQLErrMsg : String): boolean;
Var qmysql : TMYSQL;
Begin
mysql_init(PMySQL(@qmysql));
VMySock := mysql_real_connect(PMysql(@qmysql), Host, MyUser, Password, nil,0,nil,0);
if VMySock=Nil then
begin
MySQLErrMsg := 'Couldn''t connect to MySQL. '+ mysql_error(@qmysql);
MySQLConnect := False;
exit;
end
else MySQLConnect := True;
End;
после выполнения mysql_init(PMySQL(@qmysql));
меняется значение переменной MyUser. При этом название переменной не влияет на результат. :roll:
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение Vadim » 14.08.2008 10:56:48

GAMER писал(а):при определенных задачах, клиенту нужно заниматься не свойственным ему делом - делать анализ синтаксиса запроса. А если в какой -то версии появится новый тип запроса? Тогда нужно вносить изменения в код.

Нет, немножко не так. :)
Метод Open - это узкоспециальное применение запроса к БД, который в результате выполнения формирует дополнительно компонент типа DataSet, данные из которого уже потом передаются в визуальный компонент для разглядывания. Это единственная функция (формирование DataSet) для чего и нужен метод Open. Всё остальное - для ExecSQL.
Отсюда следует простой и логический вывод - именно клиентский компонент (а точнее говоря - программист :) ) должен заранее позаботится о назначении запроса, потому как к серверу формирование DataSet не имеет никакого отношения, DataSet - это манипуляция уже полученным пакетом данных, который выдал сервер.

Добавлено спустя 45 минут 6 секунд:
GAMER писал(а):меняется значение переменной MyUser

А у меня не меняется... :)

Добавлено спустя 1 минуту 49 секунд:
GAMER писал(а):При этом название переменной не влияет на результат.

Вообще-то так и должно быть. Название переменной не имеет значения, имеет значение только тип и содержимое. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение GAMER » 15.08.2008 16:34:45

Vadim писал(а):Отсюда следует простой и логический вывод - именно клиентский компонент (а точнее говоря - программист :) ) должен заранее позаботится о назначении запроса, потому как к серверу формирование DataSet не имеет никакого отношения, DataSet - это манипуляция уже полученным пакетом данных, который выдал сервер.

не спорю, но есть задачи, когда спрогнозировать действия невозможно (например при разработке клиента аля mysql)


GAMER писал(а):меняется значение переменной MyUser

Vadim писал(а): А у меня не меняется... :)


У меня в некоторых случаях тоже не меняется. Решение нашел, как сделать по иному. Со временем, когда будет время и инет где-то выложу свои примеры.

GAMER писал(а):При этом название переменной не влияет на результат.

Vadim писал(а): Вообще-то так и должно быть. Название переменной не имеет значения, имеет значение только тип и содержимое. :)

Это понятно, просто было подозрение, что использую какую-то служебную переменную.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение Vadim » 20.08.2008 16:11:33

GAMER писал(а):но есть задачи, когда спрогнозировать действия невозможно (например при разработке клиента аля mysql)

Ну, собственно, ничего сложного в прогнозировании и нет. Единственная причина, которая заставляет использовать метод Open (или другими словами - создать DataSet) - это когда сервер передал Вам пакет с данными выборки. Опять же, единственным возможным оператором запроса для этого являтся первое слово SELECT в запросе.
Так что Вашего пессимизма в отношении прогнозирования я ни в коей мере не разделяю. :)
GAMER писал(а):У меня в некоторых случаях тоже не меняется.

Надо найти причины - когда меняется. По тому примеру, что Вы привели меняться ничего не должно, просто нет никаких предпосылок для этого. Другое дело, если бы Вы вместо статической переменной qmysql в mysql_init(PMySQL(@qmysql)); использовали динамическую переменную, типа PMYSQL (что, собственно, куда логичнее для того вида процедуры, что Вы привели) в том виде, что у Вас написано, то можно было бы предположить, что испорчена чужая память (в данном случае переменной MyUser), но поскольку переменная именно статическая, то память под неё уже выделена компилятором и в чужие дебри процедура mysql_init() залезть не может.
На самом деле я первый раз слышу о такой проблеме. Ни у меня, ни где нибудь ещё в интернете, я такого не встречал никогда.

Добавлено спустя 5 минут 24 секунды:
GAMER писал(а):просто было подозрение, что использую какую-то служебную переменную

Скорее нет, чем да. Т.к. если бы внутри dll-ки находилась бы переменная с точно таким же названием, то у неё другая область видимости. Да и в pas-модуле такой переменной нет, даже если не принимать во внимание ту самую область видимости переменной.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Рейтинг@Mail.ru