Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 423
от 27.11.2007, 12:05

Администратор:Gh0stik
В рассылке:Подписчиков: 305, Экспертов: 33
В номере:Вопросов: 1, Ответов: 2


Вопрос № 110514: Привет, народ. Столкнулся с проблемой - Delphi + Firebird + IBX ))) Есть несколько вопросов. 1. У меня есть потребностьб записывать в одном из полей строку неопределенной длины (например, до 500 символов). Для этих целей правильно использ...

Вопрос № 110.514
Привет, народ.
Столкнулся с проблемой - Delphi + Firebird + IBX )))
Есть несколько вопросов.
1. У меня есть потребностьб записывать в одном из полей строку неопределенной длины (например, до 500 символов). Для этих целей правильно использовать varchar(500)?
2. работает программа с базой через инет. Я читал, что правильно работать с базой таким способом: на чтение постоянно открытая длинная (как я понял) транзакция, а на чтение наоборот. Может кто-0то просветить и как это реализовывается с помощью описанных мною выше средств?
3. Типы данных: правильно ли для всех типов ставить кодировку UTB8, а Collate (что это? )) - Unicode. И вообще, имеет ли значение, если просто например поставить win1251?
4. Как лучше работать с информацией из БД? в плане вывода. Сейчас я использую dbgrid. но мне он не очень нравится. есть ли смысл и возможность выводить все в listview, например?
5. IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('Select ....');
IBDataSet1.Open;
как отсюда выдернуть какую-то строку результата? ))
например я провожу просто сверку пароля и логина с теми, что в базе. в ответ должен получить значение еще одного поля той таблицы, например, так
SELECT val FROM table1 WHERE login='lala' and pass='lala';
то есть, если логин правильный с паролем, мне вернуть некое значение. если нет, то пустоту.
как этот val теперь выудить?

Спасибо всем, кто прочитал, а особенно, кто сейчас читает эту часть - конец
Отправлен: 22.11.2007, 11:35
Вопрос задал: Решетник Д (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 27)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Решетник Д!
Не грех бы разбить все вопросы на отдельные сообщения, а то не ответ получается а учебник по БД.
1) Char и VarChar храняться одинаково, но Char в запросе выдает полную строку, включая замыкающие проблелы, а VarChar - только сам текст.
Но! IBX рассматривает все поля как CHAR, IBObjects - как VarChar. Это нужно учитывать при написании клиента.
2) БД через инет работает также как в сети, просто вместо имени компьютера в коннекте пишете IP-адрес, например:
\217.12.8.123D:PathDatabase.fb
Управление транзакциями нужно прорабатывать всегда исходя из конкретной задачи.Тем более что IBX требует для каждого Query иметь свой собственный компонент Transaction с выставленными правилами.
В IBObjects есть автоматическое управление транзакциями, и про них можно не вспоминать до тех пор, пока на начинается тонкая отладка.
3) Если использовать кодировку UTB8 - невозможно будет строить БД из скрипта и наполнять ее из скрипта. isql.exe принимает только ASCII файлы. Следовательно нужна кодировка Win1251.
5) Вынуть данные просто Val := Query.FieldValues['NameField'];
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 22.11.2007, 11:49
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Получается у меня все мои varchar\'ы будут занимать все определенное под них место, а не столько, сколько записано информации? (( Кодировку поменяю.

Отвечает: sir henry
Здравствуйте, Решетник Д!
1. Совершенно правильно.
Только там сразу возникает проблема с индексацией, если Вы по этому полю будете проводить поиск. Со строками все БД работают довольно медленно, поэтому чтобы ускорить поиск строк, по полю которых задано условие, применяют индексирование не всего поля, а только первых несколько символов. Например 10-ти символов. В индексирование надо подставлять ровно столько, чтобы строка определялась однозначно.
Если Вы это поле не будете указывать в условиях выборки или изменения данных, то его вообще лучше не индексировать.
2. В принципе правильно. На чтение (оператор SELECT) может быть одна общая транзакция, а вот на изменение/добавление данных, на каждую из этих операцияй лучше всего открывать свою персональную транзакцию. Но в этом случае между началом и окончанием транзакции должны быть не только команды UPDATE/INSERT, но и операции проверки правильности изменения/добавления данных.Если хоть одна из проверок завершилась неуспешно, то вся транзакция полностью отменяется.
3. Нет, не правильно. Если хотите применять UTF8, то Вам необходимо будет установить компоненты в Дельфи, которые с этой кодировкой смогут работать, иначе Вам придётся каждый раз, как Вы собрались смотреть данные, перекодировать все строковые данные из UTF8 в СР1251.
Лично я бы не стал UTF8 применять, чтобы не парится.
Но... Как ысегда есть но... :) Например у Вас должна быть поддержка многоязыковых символов, например русский, татарский, китайский и т.п. языков. Вот тогда UTF8 будет в самый раз. :)
4. Нельзя сказать однозначно. Это зависит от выполняемых зада и построения интерфейса программы. Точнее говоря, удобства интерфейса под выполняемые задачи. Так что Вам сначала надо определится с задачами, каким способом удобнее будет просматривать данные по этим задачам, а тогда уж и выбирать элементы интерфейса.
5. Если речь идёт только о правильном пароле, то ничего выдёргивать не надо. Правильностью пароля будет служить тот факт, есть вообще в выборке записи или нет:

IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('Select ....');
IBDataSet1.Open;
If IBDataSet1.RecordCount>0 Then
MessageBox('Пароль верный.')
Else
MessageBox('Караул!!! На нас напали злобные хацкеры!!!');
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 22.11.2007, 12:04
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ. Индексирование не нужно для этого поля. просто, чтобы не терять время, я сразу считываю личные данные этого пользователя, без которых программа не может работать дальше.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.64 от 24.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное