OberonCore
https://forum.oberoncore.ru/

Как прикруть БД
https://forum.oberoncore.ru/viewtopic.php?f=5&t=94
Страница 1 из 2

Автор:  rogiram [ Среда, 11 Январь, 2006 00:08 ]
Заголовок сообщения:  Как прикруть БД

Использую Delphi с InterBase(FireBird). Хочется попробовать BlackBox. Но как к нему прикрутить InterBase? Читал доки по субсистеме SQL, но не могу никак въехать (с английским напряг - быстро устаю), может кто подскажет где можно посмотреть реальный пример написания драйвера (лучше без ODBC) с коментариями, а если еще и на русском...! Кто-нибудь переходил с Delphi на BB? Как проще это сделать? Если вдруг вопрос покажется глупым, просьба ногами не бить.

Автор:  Илья Ермаков [ Среда, 11 Январь, 2006 00:30 ]
Заголовок сообщения: 

Ну, во-первых, зачем читать по-аглицки, если эти доки давно на русском? Забирайте с нашего сайта из раздела Документация.

Если использовать ODBC, то требуется только лишь существование в природе ODBC-драйвера к вашей СУБД. К FireBird он 99% существует. Остальное - дело техники. В противном случае (или если нужно выжать быстродействие до капли) придется самому писать драйвер - модуль ББ с особым интерфейсом, который умеет кантачить с базой через ее API. Но лучше использовать ODBC-драйвер - и не париться. Тогда все гораздо проще, чем с тем же BDE, например.

Цитата:
Кто-нибудь переходил с Delphi на BB? Как проще это сделать?


Команда ОЦПИ "Метасистемы" перешла с C++ Builder и Delphi. Отдача ощутимая, надо сказать. Особенно если учесть исключительную глюкавость Билдера. Никаких подводных камней (которых, будучи умудрены "суровым опытом", мы ожидали) не оказалось. Вот на днях, например, потребовалось начать проект с не-MDI интерфейсом и скинами. Т.к. ББ штатно работает только с MDI, то ожидались большие сложности, но все прошло удивительно гладко (с WinApi поколдовать пришлось, разумеется, но ББ "приспособился" великолепно). И таких примеров за 5 месяцев набралось масса...

Как перейти? Во-первых, отключить на время старые стереотипы, чтобы они не мешали. Во-вторых, не спеша читать документацию. Открывайте нащ раздел Документация
- там русской инфы более чем достаточно. Можете начать с самоучителя от Информатики-21 - а потом не спеша идете по хелпу ББ (он весь переведен, недавно даже и примеры доперевели) и читаете.

С вопросами - добро пожаловать в студию, можно и на E-Mail: bb@metasystems.ru. Но лучше все-таки на форуме, чтобы разбор вопросов был полезен и другим...

Цитата:
Если вдруг вопрос покажется глупым, просьба ногами не бить.

Ну, на нашем форуме это просто не принято :-)

Автор:  Trurl [ Среда, 11 Январь, 2006 10:57 ]
Заголовок сообщения: 

Может быть, поможет SqlObxDriv?
Это шаблон-заготовка для драйвера.

Автор:  Иван Горячев [ Среда, 11 Январь, 2006 13:31 ]
Заголовок сообщения: 

С Firebird 1.5 работает почти без проблем. "Почти" заключается в том, что бесплатный ODBC-драйвер, на который натыкаешься в первую очередь, с Блэкбоксом не работает (скорре всего из-за ошибки в самом драйвере). Но например Gemini работает себе и не жужжит.

Создаёшь ODBC-алиас, говоришь
Код:
SqlDB.OpenDatabase("Odbc3", "Имя", "Пароль", "ИмяСозданногоАлиаса", db, res);
и пользуешь db как в хелпе указано.

Автор:  Илья Ермаков [ Среда, 11 Январь, 2006 17:29 ]
Заголовок сообщения: 

Odbc3 - это важно! В примерах ББ используется кое-где просто Odbc - это устаревшая версия стандарта и с большинством современных баз она работает косо.

Автор:  rogiram [ Среда, 11 Январь, 2006 21:48 ]
Заголовок сообщения:  Первый удачный коннект.

Первый удачный коннект.
Спасибо Всем!
(WinXp)
1.Скачал ODBC драйвер Firebird/InrerBase с сайта IBPhoenix.
(Full install версию)
2.Установил его (просто запуском .exe)
3.Настоил "Администратор источников данных ODBC"
(%SystemRoot%\system32\odbcad32.exe)
3.1.Закладка "Пользовательский DSN" => Кнопка "Добавить".
3.2."Data sourse name (DSN)"="base" - это имя источника данных в данной системе.
"Driver"="IscDbc" - устанавливается самостоятельно
"Database"="serverName:alias" - путь к БД в данном случае имя сервера и альяс БД
"Client"=""
"Database account"=""
"Password"=""
"Role"=""
"Character set"="WIN1251"
"Dialect"=3
остальное по вкусу
4.В BlackBox открыл SQL/Browser
"Id:"="sysdba"
"Password:"="masterkey"
"Database:"="base" - взято из "Data sourse name (DSN)"="base"
"Driver:"="SqlOdbc3"
"Statement:"="select * from my_table"
Жмем "Execute" и получаем искомое, только...
Только, почему-то, таблица имеет заголовок, но лист чистый, после прокрутки частично появляется. А кроме того вместо русских букв красуются крякозяблики. Почему? Пока не знаю. Может кто-нибудь подскажет?

Автор:  Илья Ермаков [ Среда, 11 Январь, 2006 23:03 ]
Заголовок сообщения: 

Так видимо, Service Pack наш не установлен. В оригинальной версии имеют место проблемы с кодировками для русских символов.

Скачайте Service Pack 3 из раздела Дистрибутивы - и "кракозябликов" не будет.

Автор:  Иван Горячев [ Четверг, 12 Январь, 2006 00:27 ]
Заголовок сообщения:  Re: Первый удачный коннект.

rogiram писал(а):
1.Скачал ODBC драйвер Firebird/InrerBase с сайта IBPhoenix. (Full install версию)


Про кракозяблики уже сказали. А про драйвер я же говорил - open-source не работает. Он на SELECT * FROM base честно выдаёт одну строчку (причём всегда, не зависимо от условий). Так что http://www.ibdatabase.com/ Вам поможет. Он для бывшего союза вроде бесплатный

Илья Ермаков писал(а):
Odbc3 - это важно! В примерах ББ используется кое-где просто Odbc - это устаревшая версия стандарта и с большинством современных баз она работает косо.

Да у меня и с Odbc работает. Всё равно Блэкбокс там только небольшую часть функциональности использует.

Автор:  Илья Ермаков [ Четверг, 12 Январь, 2006 00:37 ]
Заголовок сообщения: 

Цитата:
Да у меня и с Odbc работает.


Access глючит по-страшному. Да и с MySql кое-что косячит. Явный показ диалогов-сообщений не отключается и т.п.

Автор:  rv82 [ Понедельник, 10 Ноябрь, 2008 11:02 ]
Заголовок сообщения:  Re: Как прикруть БД

Что-то работа через ODBC не радует... Как появится свободное время, собираюсь приняться писать свой драйвер для Firebird.
А пока, работаю с ODBC. Какие-то странные проблемы появляются:
Код:
MODULE FbTest;
   IMPORT StdLog, SqlDB, Dates;
   
   TYPE
      DataTable = RECORD
         data_no: INTEGER;
         val: INTEGER;
         mdate: Dates.Date;
         myime: Dates.Time;
      END;
   
   PROCEDURE Do*;
   VAR
      db: SqlDB.Database;
      tab: SqlDB.Table;
      res: INTEGER;
      i: INTEGER;
      data: DataTable;
      s: ARRAY 30 OF CHAR;
   BEGIN
      SqlDB.OpenDatabase('SqlOdbc3', 'USER', '123456', 'testdb', SqlDB.sync, TRUE, db, res);
      IF res = 0 THEN
         tab:=db.NewTable();
         tab.Exec("SELECT data_no FROM data");
         FOR i:=1 TO tab.rows DO
            tab.Read(i, data);            
            StdLog.Int(data.data_no);
            StdLog.Ln;
         END;
      END;
   END Do;
END FbTest.

Программа должна вывести только номера записей. При этом выводятся на экран большие числа, вместо 1, 2, 3... (в таблице сейчас всего 5 записей). Другие данные пока не вывожу. Пытался, тоже выводится всякая чушь. Не подскажет ли кто, что я не так делаю?

Автор:  Евгений Темиргалеев [ Понедельник, 10 Ноябрь, 2008 12:22 ]
Заголовок сообщения:  Re: Как прикруть БД

Для начала попробуйте читать результат более правильно.
Цитата:
TYPE Table
...
rows: INTEGER rows >= 0
Количество строк, которые вернул самый последний запрос. Если фактический драйвер базы данных не может возвращать количество строк к запросу, rows устанавливается в MAX(INTEGER).

Прочитайте про значения table.res после выполнения Exec и Read. Вот приблизит. шаблон, который исп-т эти значения:
Код:
table.Exec("SELECT * FROM table");
IF table.res # 0 THEN
  Log.String("При вып. запроса произошла ошибка")
ELSE  (* table.res = 0 *)
  row := 0; table.Read(row, data);  (* прочитать первую строку *)
  WHILE table.res IN {0, SqlDB.converted} DO
    (* Данные считались в data 1 к 1 или с преобразованиями типов *)
    (* Обработать данные в data *)
    INC(row); table.Read(row, data)  (* прочитать следующую строку *)
  END;
  (* ~(table.res IN (0, SqlDB.converted)) *)
  IF table.res = SqlDB.noData THEN
    (* строки в таблице-результате кончились, т.е. все прочиталось *)
  ELSE  (* table.res # SqlDB.noData *)
    Log.String("Возникла ошибка при считывании результата запроса")
  END
END

Автор:  Valery Solovey [ Понедельник, 10 Ноябрь, 2008 12:28 ]
Заголовок сообщения:  Re: Как прикруть БД

А так?
Код:
      DataTable = RECORD
         data_no*: INTEGER;
         val*: INTEGER;
         mdate*: Dates.Date;
         myime*: Dates.Time;
      END;


Чтобы не бороться с непонятными на первый взгляд трапами, советую в дополнение к этому делать так, как написано в документации: множество записей, выдаваемых SELECT-ом должно соответствовать схеме записи, описанной в программе:

Код:
         tab.Exec("SELECT data_no, val, mdate, myime FROM data");

Автор:  Евгений Темиргалеев [ Понедельник, 10 Ноябрь, 2008 12:48 ]
Заголовок сообщения:  Re: Как прикруть БД

Valery Solovey писал(а):
А так?
Да-да. И поля надо экспортировать.
Цитата:
Поля записей и строки результирующих таблиц соответствуют порядку, в котором они описаны в записи или в базе данных, соответственно (SQL не определяет порядок, но реальная база данных его имеет). Поля записей должны быть экспортированы для сопоставления. Неэкспортированные поля записей просто игнорируются.

Скорее всего в этом и была ошибка. Неэкс-е поля игнорировались, data - локальная переменная и её поля изначально содержат мусор, который выводился.

Автор:  rv82 [ Вторник, 11 Ноябрь, 2008 06:41 ]
Заголовок сообщения:  Re: Как прикруть БД

Спасибо за ответы! Всё заработало! :)
Цитата:
Команда ОЦПИ "Метасистемы" перешла с C++ Builder и Delphi. Отдача ощутимая, надо сказать. Особенно если учесть исключительную глюкавость Билдера. Никаких подводных камней (которых, будучи умудрены "суровым опытом", мы ожидали) не оказалось.

Поначалу даже не верилось, что на BB удобнее работать, чем на Билдере/Делфи. Теперь же понимаю, что ББ просто несравнимо удобнее по всем параметрам. И это даже при отсутствии таких удобств, как автодополнение кода и т.д.

Автор:  Евгений Темиргалеев [ Вторник, 11 Ноябрь, 2008 09:59 ]
Заголовок сообщения:  Re: Как прикруть БД

Я в Дельфи/Билдере работу с БД так и не осилил (не прочувствовал, не понял). Учил по самоучителю типа "сам за 21 день". Там на форму наложить надо кучу всего :), какие-то поля в этой куче насоединять. Правда реальной задачи не стояло...

В ББ для "въезжания" хватило одного дня (учитывая знание SQL).

P.S. Сорри за оффтоп.

Автор:  rv82 [ Вторник, 11 Ноябрь, 2008 11:14 ]
Заголовок сообщения:  Re: Как прикруть БД

Евгений Темиргалеев писал(а):
Я в Дельфи/Билдере работу с БД так и не осилил (не прочувствовал, не понял). Учил по самоучителю типа "сам за 21 день". Там на форму наложить надо кучу всего :), какие-то поля в этой куче насоединять. Правда реальной задачи не стояло...

В ББ для "въезжания" хватило одного дня (учитывая знание SQL).

P.S. Сорри за оффтоп.

Так же, прошу прощения за оффтоп...
Я с визуальными компонентами Data Controls тоже не прочувствовал преимуществ. Работаю напрямую с "невидимыми" IB Express (читаю/пишу рямо в них). Но раздражает, что они занимают место на форме во время разработки и лежат в коде формы. От этого появляются некоторые ограничения, которые тоже раздражают. Использовать Data Modules - тоже неудобно. А в ББ таких ограничений нет. Приложение (даже логику одной формы) можно разбить на произвольное количество модулей, что значительно упрощает работу!

Для полного счастья нужен теперь только драйвер Interbase/Firebird для подсистемы Sql. А времени на его написание нет :( . И с ОДБЦ работать не нравится :( .

Автор:  Евгений Темиргалеев [ Вторник, 11 Ноябрь, 2008 13:13 ]
Заголовок сообщения:  Re: Как прикруть БД

rv82 писал(а):
Для полного счастья нужен теперь только драйвер Interbase/Firebird для подсистемы Sql. А времени на его написание нет :( . И с ОДБЦ работать не нравится :( .
А что Вам не нравится в реализации ОДБЦ к исп-й Вами базе? Медленно работает, не все функции поддерживает?? Настраивать источник данных надо?

Это я к тому, что драйвер Вы можете реализовать. Но способ его использования в ББ не изменится.

Автор:  rv82 [ Среда, 12 Ноябрь, 2008 06:06 ]
Заголовок сообщения:  Re: Как прикруть БД

Евгений Темиргалеев писал(а):
А что Вам не нравится в реализации ОДБЦ к исп-й Вами базе? Медленно работает, не все функции поддерживает?? Настраивать источник данных надо?

Это я к тому, что драйвер Вы можете реализовать. Но способ его использования в ББ не изменится.

Может быть я ошибаюсь, но мне кажется, что ОДБЦ не поддерживает хранимые процедуры. По крайней мере, я не нашёл ничего на эту тему в интернете. (Если говорить более точно, мне не удалось найти, как работать с процедурами, которые возвращают один или несколько результатов). А все мои разработки их активно используют. Да и настройка источника данных не очень радует. Просто, я использую инсталлатор, который распаковывает мою программу, СУБД Firebird и саму базу данных. При этом, в aliases.conf прописан псевдоним базы данных. А вот как сделать, чтобы этот инсталлятор ещё и источник данных регистрировал, я не знаю. Испольую Excelsior Installer. Пока что мои программы написаны на Делфи, но при первой же возможности я намерен переписать их на ББ. Заниматься поддержкой и развитием программ на Делфи - на самое простое занятие. Слишком раздутые модули получаются, а разгрузить их хотя бы частично не удаётся. :(

Автор:  Илья Ермаков [ Среда, 12 Ноябрь, 2008 12:39 ]
Заголовок сообщения:  Re: Как прикруть БД

Я делал инсталлятор, который прописывал источник даных ОДБЦ (для Майсиквеля). Дома посмотрю - скажу, как.
По поводу хранимых процедур - по-моему, ОДБЦ пропускает к БД запрос напрямую, т.е. именно в том диалекте, который поддерживает база. Значит, по идее, проблем быть не должно.

Автор:  Valery Solovey [ Среда, 12 Ноябрь, 2008 13:04 ]
Заголовок сообщения:  Re: Как прикруть БД

Но проблемы могут быть с драйвером ODBC.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/