Библиотека ADOX - нельзя использовать ADOtable.Append для вставки данных в поля после установки первичного ключа в базе данных MS Access. - PullRequest
0 голосов
/ 25 мая 2020

Я новичок в программировании баз данных, и у меня возникла проблема. Не нажимаю ни одного, но я хочу знать, в чем проблема с кодом. Я использую библиотеку ADOX для создания базы данных доступа с таблицей. Он отлично работает и все создает. А позже я могу использовать AdoTable1.append для добавления новых записей в базу данных. У меня все данные вставлены в поля. Но когда я устанавливаю поле идентификатора или любое другое в качестве ключевого поля, я не могу добавлять никаких данных. Таблица базы данных и столбцы созданы, но AdoTable1.Append просто не работает. Когда я переключаю комментарии на Key1. строк и перекомпилировать, он работает нормально и добавляет данные в поля. Я искал в Интернете, но ничего не нашел. Буду рад, если кто-нибудь знает, в чем я ошибаюсь.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ADOX_TLB, Vcl.OleServer, Data.DB,
  Data.Win.ADODB;

type
  TForm1 = class(TForm)
    Catalog1: TCatalog;
    Key1: TKey;
    Table1: TTable;
    Column1: TColumn;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Catalog1.Create1('Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=' + 'test.accdb');

 Table1.Name := 'ADOX';

 Column1.ParentCatalog := Catalog1.DefaultInterface;
 Column1.Name := 'ID';
 Column1.type_:= adInteger;
 Column1.Properties['Autoincrement'].Value := true;

 Table1.Columns.Append(Column1.DefaultInterface,0,0);

 Key1.Name := 'Primary';
 Key1.type_ := adKeyPrimary;
 Key1.Columns.Append('ID',adInteger,0);
 Table1.Keys.Append(Key1.DefaultInterface,0,EmptyParam,'','');

 Table1.Columns.Append('DATE', adDate,0);
 Table1.Columns.Append('VALUE 1', adInteger,0);
 Table1.Columns.Append('VALUE 2', adInteger,0);

 Catalog1.Tables.Append(Table1.DefaultInterface);
 Catalog1.Disconnect;

  AdoConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source= test.accdb;Persist Security Info=False';
  AdoConnection1.Connected := true;

  AdoTable1.TableName := 'ADOX';
  AdoTable1.Active := true;

  AdoTable1.Append;
  AdoTable1.FindField('DATE').AsDateTime := now;
  AdoTable1.FindField('VALUE 1').AsInteger := 100;
  AdoTable1.FindField('VALUE 2').AsInteger := 200;
  AdoTable1.Post;

end;

end.
...