Вопросы программирования баз данных на Borland Delphi

  • После работы программы не сохраняются изменения в базе Paradox. Что делать?
  • Как мне упаковать Paradox или DBF таблицу?
  • Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset?
  • Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать?
  • Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать?
  • Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать?
  • Помню еще один хороший частый вопрос про коннект к Personal Oracle, но не помню ответа на него... Hапомните?
  • Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined".
  • У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все?
  • Как создать таблицу базы данных, не используя Database Desktop?
  • Подскажите хорошую литературу по базам данных.



    Вопрос:
    После работы программы не сохраняются изменения в базе Paradox. Что делать?

    Ответ:

    Где-нибудь при закрытии главной формы выполните нижеследующие куски кода:

    Для Delphi 3: 
      Table.FlushBuffers при открытой таблице.
    Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Чтобы сбросить кэш, можно еще в после этого сделать asm mov ah, $0D int $21 end;
    Наверх к содержанию
    Вопрос:
    Как мне упаковать Paradox или DBF таблицу?

    Ответ:

    Самый простой метод -- воспользоваться функцией PackTable из rxLib. В версии 2.32 и, наверное, раньше, есть ошибка в процедуре PackTable: измените кусок:

    with tblDesc do begin
      { ... }
      bPack := true; { добавьте эту строчку для исправления ошибки и }
                     { перекомпилируйте библиотеку }
    end;
    
    (JB): Для перегенерации индексов:
      Table1.Exclusive := True;
      Table1.Open;
      Check(dbiRegenIndexes(Table1.Handle);
    
    Наверх к содержанию
    Вопрос:
    Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset?

    Ответ:

    Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в хелпе при поиске по "live result sets"

    Наверх к содержанию


    Вопрос:
    Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать?

    Ответ:

    Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию

    [Properties]
    SystemFont=Arial Cyr
    
    Если файла не существует, то его надо создать, если секции не существует, то ее надо создать.
    Для DBD 7.0 нужно испpавить pеестp: ключ
    HKCU\Software\Borland\DBD\7.0\Preferences\Properties\SystemFont="Arial Cyr"

    Наверх к содержанию
    Вопрос:
    Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать?

    Ответ:

    В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr.

    Наверх к содержанию


    Вопрос:

    Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать?

    Ответ:
    Прочитать X:\DELPHI\DOC\deploy.txt.

    Наверх к содержанию


    Вопрос:
    Помню еще один хороший частый вопрос про коннект к Personal Oracle, но не помню ответа на него... Hапомните?

    Ответ:

    user/password@2:
    Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для коннекта к сетевому серверу, (протокол TNS, имя юзера, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Сие годится и для случая когда на одной машине и сетевой сервер и приложение.

    Наверх к содержанию


    Вопрос:
    Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined".

    Ответ:

    Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям (8:3).

    Наверх к содержанию


    Вопрос:
    У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все?

    Ответ:

    Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения.

    Наверх к содержанию


    Вопрос:
    Как создать таблицу базы данных, не используя Database Desktop?

    Ответ:
    Положите компонент TTable на форму и попробуйте указанную ниже процедуру.
    procedure TForm1.CreateMyTable(NameFile: string);
    begin
      with Table1 do
      begin
        Active := False;
        DatabaseName := '';
        TableName := NameFile;
        TableType := ttDefault;
        with FieldDefs do
        begin
          Clear;
          Add('EmpNo', ftInteger, 0, False);
          Add('LastName', ftString, 20, False);
          Add('FirstName', ftString, 15, False);
          Add('PhoneExt', ftString, 4, False);
          Add('HireDate', ftDateTime, 0, False);
          Add('Salary', ftFloat, 0, False);
        end;
        with IndexDefs do
        begin
          Clear;
          Add('', 'EmpNo', [ixPrimary, ixUnique]);
          Add('ByName', 'LastName;FirstName', [ixCaseInsensitive]);
        end;
        CreateTable;
      Free;
      end;
    end;
    
    Наверх к содержанию
    Вопрос:
    Подскажите хорошую литературу по базам данных.

    Ответ:
    1. Мартин Грубер "Понимание SQL" (highly recommended)
    2. Мартин Грубер "SQL: справочное руководство" (recommended)

    Наверх к содержанию