Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Delphi+SQL Server: ошибка EDBEngineError  (Прочитано 18509 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Demidova Aigul
Гость
« : 05-05-2005 10:38 » 

Люди добрые, помогите, пожалуйста!!!
Работаю в Delphi+SQL Server и возникает ошибка "Project Project_katalog.exe raised exception class EDBEngineError with message 'BDE error $0008'. Process stopped. Use Step or Run to continue ", самая страшная, самая ужасная. Просто вешаюсь.
Эта ошибка возникает, когда я запускаю программу, нажимаю F9.  Если проверить через отладчик F7, то эта ошибка вроде бы на событие OnCreate в датамодуле, где у меня всякие запросы лежат. Ну я уже в датамодуле все эти запросы сто раз проверяла, вроде все правильно. Интересно то, что если база пустая, то при запуске F9 программа открывается (и в эту пустую базу можно спокойно вводить данные вручную), а как с импортируемыми данными (хотя бы в одной таблице), так все - пиши пропало. Еще интересно то, что если не нажимать F9, не запускать Project_katalog(Delphi Project), а просто приложение Project_katalog, то появляется заставка моей базы, пароль и т.д., те есть работает. Ну как мне, новичку, с такими ужасами разобраться, помогите, пожалуйста, знающие люди!

Может надо в датамодуле на событие OnCreate что-то поставить типа проверки на ошибку исключения? Если да, то как?   Так больше нельзя...
« Последнее редактирование: 19-12-2007 19:14 от Алексей1153++ » Записан
DJ-AMIGO
Гость
« Ответ #1 : 05-05-2005 13:16 » 

Мдяяя!  :?
Уважаемая Demidova Aigul!!! Приведите пожалуйста текст обработчика OnCreate вашего DataModule...
Дабы народ смог вникнуть в тонкости реализации вашего SQL-клиента!
Записан
Demidova Aigul
Гость
« Ответ #2 : 05-05-2005 15:07 » 

Так в том-то и дело, что я предполагаю, что там что-то нужно написать, а что толком - не знаю. Вот и прошу подсказки.
Записан
DJ-AMIGO
Гость
« Ответ #3 : 05-05-2005 15:25 » 

попробуйте свойство Active всех компонентов потомков TDataSet (а это TTable, TQuery или TClientDataSet) поставить в положение false и устанавливайте их в True на этапе выполнения!
Тот же совет хотелось бы дать касательно свойства Connected всех компонентов типа TADOConnection или например TDataBase, или например TRDSConnetion или подобный ему TSocketConnetion
Записан
DJ-AMIGO
Гость
« Ответ #4 : 05-05-2005 15:27 » 

И желательно устанавливать эти свойства с обработкой исключений
try ... finally ... end;
или try ... except ... end;
Записан
Dimyan
Гость
« Ответ #5 : 05-05-2005 16:27 » 

OnCreate приведи, какя разница что ты не понимаешь что там написано!!! Там же что то написано раз ты говоришь что на это событие исключение
Записан
Demidova Aigul
Гость
« Ответ #6 : 06-05-2005 04:09 » 

Спасибо всем за подсказки! Когда я нажимаю F7, то сначала отладчик проверяет, а потом останавливается и появляется ошибка.

program Project_katalog;

uses
  Forms,
  Unit1_vvod in 'Unit1_vvod.pas' {Form1},
  dm_unit in 'dm_unit.pas' {dm: TDataModule},
  view_unit in 'view_unit.pas' {add_form},
  zastavka_FLog in 'zastavka_FLog.pas' {Form2},
  UPSW in 'UPSW.pas' {FPSW},
  pi in 'pi.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4},
  RP in 'RP.pas' {Form5};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(Tdm, dm); // здесь курсор останавливается и ошибка появляется
  Application.CreateForm(Tadd_form, add_form);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TFPSW, FPSW);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.Run;
end.

А вот все, что у меня есть в датамодуле (код). Только не судите строго. Я только учусь.

unit dm_unit;

interface

uses
  SysUtils, Classes, ImgList, Controls, DB, DBTables, Menus, ExtDlgs,
  Dialogs;

type
  Tdm = class(TDataModule)
    Query_razdel_rubr: TQuery;
    DataSource2_razdel_rubr: TDataSource;
    modif_razdel_rubr: TQuery;
    modif_pi: TQuery;
    DataSource3: TDataSource;
    Query_pi: TQuery;
    Query_end_registr: TQuery;
    DataSource_end_registr: TDataSource;
    Query_sv_instruct: TQuery;
    DataSource_sv_instruct: TDataSource;
    Query_graf_prilo: TQuery;
    DataSource_graf_prilo: TDataSource;
    Query_folder: TQuery;
    DataSource_folder: TDataSource;
    Query_book: TQuery;
    DataSource_book: TDataSource;
    Query1: TQuery;
    DataSource1: TDataSource;
    ImageList1: TImageList;
    modif: TQuery;
    modif2: TQuery;
    modif_end_registr_dobav: TQuery;
    modif_end_registr: TQuery;
    modif_sv_instruct_dobav: TQuery;
    modif_sv_instruct: TQuery;
    modif_graf_prilo: TQuery;
    modif_graf_prilo_dobav: TQuery;
    modif_folder_dobav: TQuery;
    modif_folder: TQuery;
    modif_book_dobav: TQuery;
    modif_book: TQuery;
    Query_razdel_podrubr: TQuery;
    modif_razdel_podrubr: TQuery;
    DataSource_razdel_podrubr: TDataSource;
    Query_path: TQuery;
    modif_path: TQuery;
    DataSource2: TDataSource;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    Query_perv_folder: TQuery;
    Query_perv: TQuery;
    modif_perv_folder_dobav: TQuery;
    modif_perv_dobav: TQuery;
    DataSource_perv_folder: TDataSource;
    DataSource_perv: TDataSource;
    modif_perv_folder: TQuery;
    modif_perv: TQuery;
    Query1id: TIntegerField;
    Query1InventoryID: TStringField;
    Query1Autors: TMemoField;
    Query1ReportName: TMemoField;
    Query1ReportYear: TStringField;
    Query1OrgName: TMemoField;
    Query1OrgAdress: TMemoField;
    Query1Abstract: TMemoField;
    Query1KeyWords: TMemoField;
    Query1ColBooks: TIntegerField;
    Query1ColFolders: TIntegerField;
    Query1ColPervInf: TIntegerField;
    Query1dostup_k_referat: TStringField;
    Query_bookid: TIntegerField;
    Query_bookInventoryID: TStringField;
    Query_bookNumberBook: TStringField;
    Query_bookDostup: TStringField;
    Query_bookTypeBook: TStringField;
    Query_bookKolPage: TIntegerField;
    Query_bookKolIllustr: TIntegerField;
    Query_bookKolTable: TIntegerField;
    Query_bookKolTextPrilozh: TIntegerField;
    Query_bookKolLiter: TIntegerField;
    Query_folderid: TIntegerField;
    Query_folderInventoryID: TStringField;
    Query_folderNumberFolder: TStringField;
    Query_folderDostup: TStringField;
    Query_folderColGrafPrilozh: TIntegerField;
    Query_graf_priloid_graf_prilo: TIntegerField;
    Query_graf_priloInventoryID: TStringField;
    Query_graf_priloNumbGrafPrilo: TStringField;
    Query_graf_priloNameGrafPrilo: TMemoField;
    Query_graf_priloDostup_k_graf_prilo: TStringField;
    Query_graf_priloNumberFolder: TStringField;
    Query_sv_instructid: TIntegerField;
    Query_sv_instructInventoryID: TStringField;
    Query_sv_instructIndexInfMaterial: TStringField;
    Query_sv_instructIndexStadii: TStringField;
    Query_sv_instructIndexTypePI: TStringField;
    Query_sv_instructStepenZavershRabot: TStringField;
    Query_end_registrid: TIntegerField;
    Query_end_registrInventoryID: TStringField;
    Query_end_registrter_upr: TStringField;
    Query_end_registrAdmOblWork: TMemoField;
    Query_end_registrNomenclatura: TStringField;
    Query_end_registrRubriki: TStringField;
    Query_end_registrpolisk: TStringField;
    Query_end_registrpodrubriki: TStringField;
    Query_end_registrDateRegistration: TStringField;
    Query_end_registrFIO_Registrator: TStringField;
    Query_piid_polisk: TIntegerField;
    Query_piplsk_name: TStringField;
    Query_razdel_rubrid_rub: TIntegerField;
    Query_razdel_rubrname_rubriki: TStringField;
    Query_razdel_podrubrid_podrubriki: TIntegerField;
    Query_razdel_podrubrNamePodrubriki: TStringField;
    Query_razdel_podrubrid_rub: TIntegerField;
    Query_pathid: TIntegerField;
    Query_pathpath: TBlobField;
    Query_pathInventoryID: TStringField;
    Query_perv_folderid: TIntegerField;
    Query_perv_folderInventoryID: TStringField;
    Query_perv_folderNumberPerv: TStringField;
    Query_perv_folderDostup: TStringField;
    Query_perv_folderColPervInf: TIntegerField;
    Query_pervid: TIntegerField;
    Query_pervInventoryID: TStringField;
    Query_pervNumbPervData: TStringField;
    Query_pervNamePervData: TMemoField;
    Query_pervDostupPervData: TStringField;
    Query_pervNumberPerv: TStringField;
    procedure N2Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure DataModuleCreate(Sender: TObject);

   
  private
    { Private declarations }
  public
  procedure ShowError(AExc: EDBEngineError);
  procedure delet(r,wher:string;cod:Word);
  procedure ebd_error(query_name:TQuery);
    { Public declarations }
  end;

var
  dm: Tdm;

implementation

uses Unit1_vvod, view_unit, pi, Unit4, RP;

{$R *.dfm}

{ Tdm }

procedure Tdm.delet(r, wher: string; cod: Word);
var q:TQuery;
begin
  q:=TQuery.Create(Self);
  q.SQL.Add('delete  from '+r+'');
  q.SQL.Add('where '+wher+' = '+ IntToStr(cod)+'');
  q.DatabaseName:='katalogi';
  q.Prepare;
  q.ExecSQL;
  q.Free;
end;


procedure Tdm.N2Click(Sender: TObject);
begin
with modif_path do begin
  Close;
  SQL.Clear;
  SQL.Add('delete from map_path where InventoryID ='+dm.Query1InventoryID.AsString+'');
  Prepare;
  ExecSQL;
end;

end;

procedure Tdm.N1Click(Sender: TObject);
var bs:TBlobStream;
begin
with modif_path do

if OpenPictureDialog1.Execute then begin
Form1.image_mapp.Picture.LoadFromFile(OpenPictureDialog1.FileName);
  Close;
  SQL.Clear;
  SQL.Add('insert into map_path (path,InventoryID) values (:0, :1)');
  ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName,ftGraphic);
  ParamByName('1').AsString := dm.Query1InventoryID.AsString;
  Prepare;
  ExecSQL;
  Query1.Close;
  Query1.Open;
end;
end;


procedure Tdm.ebd_error(query_name: TQuery);
var sqll:string;
begin
try
query_name.Close;
query_name.SQL.Clear;
query_name.SQL.Add(sqll);
query_name.Open;

except
on EDBEngineError do query_name.ExecSQL;
end;
end;



procedure Tdm.DataModuleCreate(Sender: TObject);
begin
ebd_error(Query1);
ebd_error(Query_book);
ebd_error(Query_folder);
ebd_error(Query_graf_prilo);
ebd_error(Query_sv_instruct);
ebd_error(Query_end_registr);
ebd_error(Query_pi);
ebd_error(Query_razdel_rubr);
ebd_error(Query_razdel_podrubr);
ebd_error(Query_path);
ebd_error(Query_perv_folder);
ebd_error(Query_perv);
end;


end.

Вот то, что красным выделено - это жалкие попытки что-то предпринять по поводу ошибки.  А вообще отладчик даже не заходит в код датамодуля, он останавливается на   Application.CreateForm(Tdm, dm);    Так больше нельзя...


« Последнее редактирование: 19-12-2007 19:16 от Алексей1153++ » Записан
DJ-AMIGO
Гость
« Ответ #7 : 06-05-2005 09:07 » 

А ты свойство Active всех компонетов TQuery  поставила в False по умолчанию (в инспекторе объектов)?
Если нет, то обязательно поставь... А еще реальнее все датасеты открывать по мере необходимости, например непосредственно перед выводом в DbGrid...
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 06-05-2005 09:11 » 

Быть такого не может Быть такого не может Быть такого не может О Боже. Неужели это все открывается и визуализируется одновременно! 
Вызвало затруднение просто посчитать количество TQuery и TDataSource. За что вы так их! (себя и программу).
По теме:
Поскольку кода Tdm.CreateForm не существует, то ощибка заложена в каком-либо предустанавливаемом свойстве одного (или нескольких) объектов входящих в DataModule.
« Последнее редактирование: 06-05-2005 10:04 от Oldy » Записан

С уважением, Oldy.
DJ-AMIGO
Гость
« Ответ #9 : 06-05-2005 09:18 » 

Погоди-ка! ТЫ же вроде открываешь TQuery и при этом свойство SQL у тебя пустое, там ведь надо  написать хотя бы начальную выборку! Короче еще можешь попробовать в процедуре

procedure Tdm.ebd_error(query_name: TQuery);
var sqll:string;
begin
try
query_name.Close;
query_name.SQL.Clear;
query_name.SQL.Add(sqll);
query_name.Open;

except
on EDBEngineError do query_name.ExecSQL;
end;
end;

убрать проверку на исключение

on EDBEngineError do query_name.ExecSQL;

А так вообще сложно определить, почему у тебя ошибка выскакивает!?  :?
Записан
Demidova Aigul
Гость
« Ответ #10 : 06-05-2005 10:24 » 

DJ-AMIGO, последовала одному из твоих советов: " А ты свойство Active всех компонетов TQuery  поставила в False по умолчанию (в инспекторе объектов)?
Если нет, то обязательно поставь... А еще реальнее все датасеты открывать по мере необходимости, например непосредственно перед выводом в DbGrid..."

Очень удивлена, но у меня после этого все прекрасно заработало!  Отлично
Я везде сделала Active=False, а в True переводила на OnShow на каждой странице вкладки, где у меня один или несколько DBGridEh стоят. Я правильно поняла, что у меня ошибка EDBEngineError возникала из-за Active=True? Если так, то в будущем мне в датамодуле нужно всегда все запросы ставить в Active=False?

А еще я закомментировала procedure Tdm.ebd_error(query_name: TQuery);. Подумала, что у меня теперь и так все работает после того как сделала Active=False. Или все-таки довести ее до ума и использовать на всякий случай?  Улыбаюсь

А еще хотела спросить: когда я запускаю программу, перед появлением заставки моей базы данных появляется окно "Database Login". В этом окне мне каждый раз приходится писать UserName (в моем случае это "sa"). Как мне сделать, чтобы это окно вообще не появлялось при запуске программы? База у меня соединяется через ODBC, и там я указываю этот "sa". Видимо, это из-за этого. Но я не хочу, чтобы появлялось окно  "Database Login".   :?




« Последнее редактирование: 06-05-2005 10:35 от Demidova Aigul » Записан
DJ-AMIGO
Гость
« Ответ #11 : 06-05-2005 10:34 » 

Да! именно из-за этого у тебя ошибка и возникала (Active=True). Впредь всегда в любом датасете устанавливай это свойство программным способом и то по мере необходимости! Да и будет тебе тогда вечное счастье!  Отлично
« Последнее редактирование: 06-05-2005 10:37 от DJ-AMIGO » Записан
Demidova Aigul
Гость
« Ответ #12 : 06-05-2005 10:37 » 

А еще хотела спросить: когда я запускаю программу, перед появлением заставки моей базы данных появляется окно "Database Login". В этом окне мне каждый раз приходится писать UserName (в моем случае это "sa"). Как мне сделать, чтобы это окно вообще не появлялось при запуске программы? База у меня соединяется через ODBC, и там я указываю этот "sa". Видимо, это из-за этого. Но я не хочу, чтобы появлялось окно  "Database Login".   :?
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 06-05-2005 11:18 » 

Цитата
не хочу, чтобы появлялось окно  "Database Login". 

Щелкните дважды на компоненте TDatabase.  В поле "Parameter overrides" должны быть следуюшие строки:
Код:

USER NAME=SA
PASSWORD=ваш_пароль

снимите "птичку" Login prompt

Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #14 : 10-05-2005 06:24 » 

Что-то не получается убрать окно  "Database Login". У меня в датамодуле нет компонента TDatabase, потому что в компонентах TQuery я указываю название базы. То есть у меня соединение с базой происходит так: пуск--->настройка--->панель управления--->администрирование--->Источники данных (ODBC)--->System DSN--->название system data source--->и т.д. В общем, я запуталась.   :?   Попробовала поставить компонент TDatabase, убрала птичку, но все равно  не убирается окно  "Database Login".   :?
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 10-05-2005 16:09 » 

1. Добавляем компонент TDataBase
2. TDataBase.AliasName = Источники данных (ODBC)--->System DSN--->название system data source
3. TDataBase.DatabaseName = Новое имя (лучше созвучное system data source, легче будет править имена в TQuery)
4. TDatabase.Params = USER NAME=SA PASSWORD=ваш_пароль
5. TDatabase.LoginPrompt = False
6. TDatabase.Connected = True
7. Все TQuery.DatabaseName=Новому имени (пункт 3)
Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #16 : 11-05-2005 07:39 » 

Спасибо за подсказку, Oldy!  Улыбаюсь У меня есть вопрос насчет 4 пункта: можно не указывать пароль? Просто пароль у меня запрашивается в специальной формочке, которая выводится после заставки.
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 11-05-2005 07:46 » 

Цитата
можно не указывать пароль? Просто пароль у меня запрашивается в специальной формочке, которая выводится после заставки.

Ну если этого достаточно для подключения к базе данных без окна "Database Login", то можно не указывать. Улыбаюсь
Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #18 : 12-05-2005 09:36 » 

Oldy, а у меня почему-то все равно не получилось. Вроде все по пунктам сделала.  :017:   Правда, я ничего не указала в "Driver name", ну так я не знаю, что там указать. Но TDatabase.Connected = True получилось же, тогда почему не получается?
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 12-05-2005 10:41 » 

А его (Driver Name) и не надо указывать. DatabaseName изменили у всех Query?
« Последнее редактирование: 12-05-2005 10:48 от Oldy » Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #20 : 12-05-2005 10:49 » 

Да,  DatabaseName изменила для всех Query. Еще раз проверила - все равно появляется это окно.
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 12-05-2005 11:21 » 

Что-то упущено, возможно пароль?
Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #22 : 12-05-2005 11:29 » 

Когда я делала пуск--->настройка--->панель управления--->администрирование--->Источники данных (ODBC)--->System DSN--->название system data source--->и т.д. - я там не задавала пароль.
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 12-05-2005 11:31 » 

Вполне достаточно его ввести в TDatabase, иначе все время будет переспрашивать.
Записан

С уважением, Oldy.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines