Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 28.03.2018
Сообщений: 10
1

Как мне настроить обращение к базе или как ее открыть?

28.03.2018, 23:56. Показов 5324. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Знаю, глупый вопрос задам, но деваться не куда. Сразу поправлюсь, в БД я ноль, но разобраться с вопросом нужно.
Подскажите, как мне настроить обращение к базе или как ее открыть.
Поясню в чем суть вопроса: Есть софт который работает с FDB базами, а точнее в них ведет учет клиентов, заказав, материалов, товарный учет. Но у предприятия нет программы для планирования производства. Так чтоб не забивать все данные во второстепенный софт вручную, нужно настроить обращение к этим базам данных, чтоб второстепенный софт выдергивал из них нужную инфу и подставлял в определенный график планирования.

Установил Firebird и IBExpert

Но в итоге открывая база в IBExpert выдает такую дичь. Подскажите что делать и как быть. Или хотя бы где копать...

Error Message:
----------------------------------------
Unsuccessful execution caused by an unavailable resource.
unavailable database.


[00541C13] FIB.IBError (Line 556, "FIB.pas" + 55) + $2
[0053D60C] FIBDatabase.TFIBDatabase.Open (Line 1122, "FIBDatabase.pas" + 64) + $9
[00517BC3] pFIBDatabase.TpFIBDatabase.Open (Line 285, "pFIBDatabase.pas" + 9) + $2
[0053D8FD] FIBDatabase.TFIBDatabase.SetConnected (Line 1192, "FIBDatabase.pas" + 4) + $4
[010C128E] IBEDatabases.TIBEDatabase.Connect (Line 3238, "IBEDatabases.pas" + 2) + $10
[0105976A] InspectorFm.TInspectorFrame.OpenDatabase (Line 3325, "Frames\InspectorFm.pas" + 44) + $D
[01054582] InspectorFm.TInspectorFrame.ObjectsTLDblClick (Line 1292, "Frames\InspectorFm.pas" + 11) + $A
[0045539D] Controls.TControl.DoMouseDown (Line 4306, "Controls.pas" + 2) + $21
[00455459] Controls.TControl.WMLButtonDblClk (Line 4331, "Controls.pas" + 5) + $C
[00444160] Forms.StdWndProc (Line 1459, "Forms.pas" + 8) + $0
[0044D96F] Forms.TApplication.ProcessMessage (Line 6630, "Forms.pas" + 13) + $1
[01106B4A] IBExpert.IBExpert (Line 935, "D:\Projects_5\IBExpert\IBExpert.dpr" + 147) + $7
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2018, 23:56
Ответы с готовыми решениями:

Как бы мне настроить Wi-Fi?
Уважаемые коллеги! У меня на очень древнем компе стоит Linux Debian. что-то комп не видит Wi-Fi...

Как мне открыть код?
Здравствуйте!!! Я новенький. Мне нужна ваша помощь. У меня стоит консольное приложение (т.е....

Подскажите как мне открыть фаил мдф
как мне конвектировать или просмотреть фаил в формате mdf.

Как мне настроить Angular 8 SSR в связке с .NET Core?
Собираюсь создать реактивное приложение на Angular 8 с SSR и .NET Core. Собственно, есть ли...

7
479 / 392 / 112
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
29.03.2018, 03:26 2
Цитата Сообщение от SUNR1s Посмотреть сообщение
база в IBExpert выдает такую дичь
Это не база выдает тебе "дичь", а IBExpert. Возможно "кривая" установка IBExpert
0
0 / 0 / 0
Регистрация: 28.03.2018
Сообщений: 10
29.03.2018, 23:48  [ТС] 3
Ок! Спасибо. Немного ближе подобрался=))

Файл базы открывается в IBExpert, все круто=)

Теперь другая проблема, не могу подключится к ней в Delphi, выдает вот такую хрень

Unsupported on-disk structure for file L:\***\DEMO.FDB; found 32779, support 17

Не могу найти инфу по этой ошибки((( Уже все перепробовал, что нашел.

Firebird 2.5.8.27089 поставил IBXepert с офсайта поставил (В нем база открывается если указать fbembed.dll из Firebird-2.5.8.27089-0_Win32_embed вместо gds32.dll) Все по туториалу так сказать.

Но в делфях не открывает(

Ребят простите за возможно глупые вопросы, выручите советом, хотя бы где копать(
0
9 / 9 / 1
Регистрация: 25.06.2017
Сообщений: 51
03.04.2018, 01:24 4
Цитата Сообщение от SUNR1s Посмотреть сообщение
Unsupported on-disk structure for file
у тебя гранаты не той системы

У каждой версии сервера своя ODS. В конкретном твоем случае ошибка говорит, что ты пытаешься открыть базу не той клиентской библиотекой. Не знаю, какие туториалы ты читал, но я бы посоветовал тебе почитать Ковязина и Вострикова "Мир InterBase" (книжка есть на рутрекере) или Хелен Борри "Firebird: руководство разработчика баз данных".

Цитата Сообщение от SUNR1s Посмотреть сообщение
Ребят простите за возможно глупые вопросы, выручите советом, хотя бы где копать(
Если вкратце: различают полноценный и встроенный (embedded) сервер. Полноценный сервак может запускаться и как служба(демон), и как приложение. Про различные архитектуры сервера (суперсервер, классик, суперклассик) читай сам.

Все, что написано ниже, справедливо для FB 2.5.х и ниже (в FB 3.x.x кое-что м.б. немного по-другому).

Если ставишь сервер штатным инсталлятором, то по умолчанию он должен установиться, как служба (т.е. прописать себя любимого в реестре, как единственного, кто может работать с базами Firebird на данной машине, и установить себя в автозапуск и приготовиться слушать порт 3050). При этом в процессах винды будет висеть служба сервера fbserver.exe, который находится в <Firebird root dir>\bin\. В этой же папке находится клиентская библиотека fbclient.dll, которую и надо указывать при подключении компонентов доступа к БД.

Теперь про gds32.dll. Исторически эта библа осталась от Interbase (форком которого и является firebird). Опять же исторически она помещалась %SystemRoot%\system32\(для x32). Поэтому "встроенные" дельфевые компоненты IBX "ищут" ее именно там. И у программера нет возможности без хака указать другую клиентскую библиотеку (в FIBPlus, которое используется IBExpert'ом, это поведение уже изменено). Вот поэтому (для тех, кто пользуется IBX в дельфях) в штатном инсталляторе Firebird предлагается возможность скопировать еще один экземпляр fbclient.dll в %SystemRoot%\system32\, но под именем gds32.dll.

Желательно, чтобы строка коннекта к базе выглядела так: <имя сервера или IP>/<номер порта, если не 3050>:<полный путь к БД>

Имя сервера или IP указывается в файле %SystemRoot%\system32\drivers\etc\hosts, например
PureBasic
1
2
127.0.0.1 localhost #если сервер  и база крутится на той же машине, где и клиент {1}
192.168.10.20 MyRemoteHost #если сервер  и база крутятся на удаленной машине {2}
Тогда строка коннекта будет выглядеть примерно так (будем считать, что FB слушает стандартный порт 3050)
PureBasic
1
localhost:c:\MyDB\mydb.fdb
или (равнозначно)
PureBasic
1
127.0.0.1:c:\MyDB\mydb.fdb
Вот эту часть <имя сервера или IP>/<номер порта, если не 3050> можно записать в виде алиаса в файле aliases.conf и указывать в строке подключения (прежде всего из соображений безопасности).

Если не указать имя сервера или IP, то для FB 1.5.x доступ к базе будет монопольным (т.е. другие приложения подключиться уже не смогут), для FB 2.1.x не помню, FB 2.5.x вроде не блокирует (для суперсервера точно).

Если я правильно ошибаюсь, сервер, запущенный как служба, на данной машине может быть только один. Если тебе необходимо, чтобы на машине крутилось несколько серверов (например, 2.1.x + 2.5.x + 3.0.x), то их надо будет запускать, как приложение. При этом необходимо изменить несколько настроек в firebird.conf. Это ты сможешь узнать потом, когда освоишь азы.

Встроенный (embedded) сервер это fbserver.exe + fbclient.dl = fbembed.dll. Указываешь только путь к базе и эту библу (без пароля и логина). Не рекомендуется для разработки.

Ну и напоследок. Если у тебя русскоязычная винда (кодовая страница win1251), то ты можешь совершенно бесплатно пользовать IBE отсюда. Разработчики FB тусуются здесь, но с пустой головой ходить туда не советую

Вроде все.
0
0 / 0 / 0
Регистрация: 28.03.2018
Сообщений: 10
03.04.2018, 01:39  [ТС] 5
о_О=))) Очень круто все объяснил!
Спасибо за инфу. Она в любом случае мне пригодится,
но на данном этапе уже разобрался и решил вопрос.
Правда теперь немного Делва голову делает.
Прописал обращение к библиотеке через 2 IBQuery, так как обращение в таблице к разным строкам идет.
Для теста компилил, все было круто, все работало. После 5 или 6 раза и последнего сохранения начал выбрасывать

Access violation at address 006DA6F5 in module 'proizvodstvo2'. Read of address 00000000.
0
9 / 9 / 1
Регистрация: 25.06.2017
Сообщений: 51
03.04.2018, 09:11 6
Цитата Сообщение от SUNR1s Посмотреть сообщение
После 5 или 6 раза и последнего сохранения начал выбрасывать
Access violation at address 006DA6F5 in module 'proizvodstvo2'. Read of address 00000000.
Могу предположить, что ошибка никак не связана с Firebird. AV - это обращение к несуществующему объекту в памяти. Приводи полный код процедуры
0
0 / 0 / 0
Регистрация: 28.03.2018
Сообщений: 10
03.04.2018, 12:20  [ТС] 7
Проблема была связанна с коряво установленными FireBird и IBExpert.

Вопрос решен таким образом: Снес все начисто, скачал программы с оф.сайтов и поставил по новой.

Все работает.

Цитата Сообщение от dddoc Посмотреть сообщение
Могу предположить, что ошибка никак не связана с Firebird. AV - это обращение к несуществующему объекту в памяти. Приводи полный код процедуры
Тут не правильно прописал
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
procedure TIoP.FormCreate(Sender: TObject);
begin
  Button2.Visible := False;
  Edit1.Enabled := False;
  Edit2.Enabled := False;
  Edit3.Enabled := False;
  Edit4.Enabled := False;
  Edit5.Enabled := False;
  Edit6.Enabled := False;
  Edit7.Enabled := False;
  Edit8.Enabled := False;
  Edit9.Enabled := False;
  Edit10.Enabled := False;
  Edit11.Enabled := False;
  Edit12.Enabled := False;
  Edit13.Enabled := False;
  Edit14.Enabled := False;
  Edit15.Enabled := False;
  Edit16.Enabled := False;
  Edit17.Enabled := False;
  Edit18.Enabled := False;
  Edit19.Enabled := False;
  ComboBox1.Enabled := False;
  Image1.Enabled := False;
  Memo1.Enabled := False;
  Memo2.Enabled := False;
  Button4.Enabled := False;
  Button5.Enabled := False;
 
  begin
    // Запрос SQL на поиск нужной ячейки в таблице БД и вывод ее в нужный Edit
    with IoP.IBQuery1 do
    begin
      // Поиск нужного ID (ключа (1)) в определенном столбце "KODHUMAN" таблицы "HUMANS".
      sql.Text := 'select * from HUMANS where KODHUMAN=' + IntToStr(2);
      Open;
      IoP.Edit1.Text := fields[4].AsString;
      IoP.Edit2.Text := fields[5].AsString;
      IoP.Edit3.Text := fields[6].AsString;
      IoP.Edit4.Text := fields[7].AsString;
      // Замена текста компонента на значение которое находится в искомой ячейки
    end;
   end;
 
    begin
    // Запрос SQL на поиск нужной ячейки в таблице БД и вывод ее в нужный Edit
    with IoP.IBQuery2 do
    begin
      // Поиск нужного ID (ключа (1)) в определенном столбце "KODHUMAN" таблицы "HUMANS".
      sql.Text := 'select * from HUMANS where KODHUMAN=' + IntToStr(1); //Строка №1 "Директор"
      Open;
      IoP.Edit1.Text := fields[16].AsString; // Фамилия
      IoP.Edit2.Text := fields[17].AsString; // Имя
      IoP.Edit3.Text := fields[18].AsString; // Отчество
      IoP.Edit4.Text := fields[19].AsString; //Телефон
      // Замена текста компонента на значение которое находится в искомой ячейки
    end;
 
 
  end;
 
 
 
end;
 
end.
Нужно было так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TIoP.FormCreate(Sender: TObject);
begin
  Button2.Visible := False;
  Edit1.Enabled := False;
  Edit2.Enabled := False;
  Edit3.Enabled := False;
  Edit4.Enabled := False;
  Edit5.Enabled := False;
  Edit6.Enabled := False;
  Edit7.Enabled := False;
  Edit8.Enabled := False;
  Edit9.Enabled := False;
  Edit10.Enabled := False;
  Edit11.Enabled := False;
  Edit12.Enabled := False;
  Edit13.Enabled := False;
  Edit14.Enabled := False;
  Edit15.Enabled := False;
  Edit16.Enabled := False;
  Edit17.Enabled := False;
  Edit18.Enabled := False;
  Edit19.Enabled := False;
  ComboBox1.Enabled := False;
  Image1.Enabled := False;
  Memo1.Enabled := False;
  Memo2.Enabled := False;
  Button4.Enabled := False;
  Button5.Enabled := False;
 
  begin
    // Запрос SQL на поиск нужной ячейки в таблице БД и вывод ее в нужный Edit
    with IoP.IBQuery1 do
    begin
      // Поиск нужного ID (ключа (1)) в определенном столбце "KODHUMAN" таблицы "HUMANS".
      sql.Text := 'select * from HUMANS where KODHUMAN=' + IntToStr(2);
      Open;
      IoP.Edit1.Text := fields[4].AsString;
      IoP.Edit2.Text := fields[5].AsString;
      IoP.Edit3.Text := fields[6].AsString;
      IoP.Edit4.Text := fields[7].AsString;
      // Замена текста компонента на значение которое находится в искомой ячейки
      First;
      // Поиск нужного ID (ключа (1)) в определенном столбце "KODHUMAN" таблицы "HUMANS".
      sql.Text := 'select * from HUMANS where KODHUMAN=' + IntToStr(1); //Строка №1 "Директор"
      Open;
      IoP.Edit1.Text := fields[16].AsString; // Фамилия
      IoP.Edit2.Text := fields[17].AsString; // Имя
      IoP.Edit3.Text := fields[18].AsString; // Отчество
      IoP.Edit4.Text := fields[19].AsString; //Телефон
      // Замена текста компонента на значение которое находится в искомой ячейки
    end;
 
 
  end;
 
 
 
end;
 
end.
0
9 / 9 / 1
Регистрация: 25.06.2017
Сообщений: 51
03.04.2018, 22:39 8
Цитата Сообщение от SUNR1s Посмотреть сообщение
Нужно было так
Во второй портянке ты два раза пытаешься селектить один и тот же датасет, причем во второй раз меняешь текст запроса еще открытого датасета? Я правильно понял?

по коду:
1. вместо
Pascal
1
IoP.Edit1.Text := fields[16].AsString; // Фамилия
используй для наглядности
Pascal
1
IoP.Edit1.Text := FieldByName('<название поля с фамилией>').AsString;
2. Используй параметризованные запросы
вместо
Delphi
1
 'select * from HUMANS where KODHUMAN=' + IntToStr(1)
используй
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Active:= False; // иначе не сможешь изменить текст запроса у открытого датасета 
sql.Text:= 'select * from HUMANS where KODHUMAN= :KODHUMAN';
ParamCheck:= True;
ParamByName('KODHUMAN').Value:= 1;//здесь сервер сам конвертирует любое значение в тип variant
Prepare;
 
try
  Active:= True; //вместо Open, но тогда в случае ошибки можно отменить открытие датасета
except
  on E:EIBClientError do //можно на худой конец написать E:Exception
  begin
    ShowMessage(E:Message); // показываем вменяемый текст ошибки
    Active:= False; //отменяем открытие датасета
  end;
finally;
0
03.04.2018, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2018, 22:39
Помогаю со студенческими работами здесь

Как настроить поиск по базе данных?
Я на своем сайте создал таблицу, назовем ее authors. так у меня хранятся имена авторов. мне нужно,...

У меня две ошибки по Базе данных: как мне их исправить
У меня две ошибки по Базе данных помогите мне пожалуйста их исправить заранее спасибо. ...

Как мне открыть файл в Excel по нажатию на кнопку в программе
У меня есть программа, которая создает xls файл, как меня открыть этот файл в Excel по нажатию на...

Как мне програмно открыть различные файлы из своей проги.
Как мне програмно открыть различные файлы из своей проги.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru