6

私はDelphiのデータベースとデータベースの初心者であり、オンラインの教材を通じて両方について学びます。私は実際の生活と私が見つけた例の違いに苦しんでいます。具体的には、一般的な本と著者の多対多の関係を考慮してください。Bookテーブル(book_id、book_titleなど)、Authorテーブル(author_id、author_nameなど)、およびAuthorBook結合テーブルがあるとします。3つのテーブルはすべて、主キーとして自動生成された一意のIDを持ちます。

例は常に、それぞれのテーブルにすでに挿入されている著者と本の情報で始まります。ただし、実際には、両方のテーブルにレコードを同時に挿入しようとしていると思います。つまり、ユーザーには、本のタイトルとその著者を入力する場所のあるフォームまたはグリッドが表示されます。データ対応のコントロール、基盤となるAccessデータベース(またはSQLを介して変更可能な他の何か)を想定して、Delphiでそのようなものをどのようにコーディングしますか?

4

2 に答える 2

7

このようなテーブルから始めた場合。。。

create table books (
  book_id integer primary key,
  book_title varchar(15) not null
);

create table authors (
  author_id integer primary key,
  author_name varchar(15) not null
);

create table book_authors (
  book_id integer not null references books (book_id),
  author_id integer not null references authors (author_id),
  primary key (book_id, author_id)
);

。。。また、新しい本と新しい著者を同時に挿入する必要がある場合は、次のようなSQLトランザクションを実行できます。

begin transaction;
insert into books values (1, 'First book');
insert into authors values (1, 'First author');
insert into book_authors (book_id, author_id) values (1, 1);
commit;

単一のトランザクションを使用すると、3つの挿入すべてがデータベースに書き込まれるか、いずれも書き込まれないことが保証されます。代替案は

  • データベースに更新可能なビューを作成し、3つのテーブルすべてを結合し、ビューに挿入するには、
  • データベースにストアドプロシージャを記述し、ストアドプロシージャを挿入し、
  • 各テーブルに個別に挿入します。これは、著者がわからなくても本の存在が重要であると想定し、その逆も同様です。(これはおそらく私が本や著者のために行うことです。)

既存の著者のために新しい本を追加する場合は、わずかに異なるトランザクションを実行します。

begin transaction;
insert into books values (2, 'Second book');
insert into book_authors (book_id, author_id) values (2, 1);
commit;

Delphiは、ここでは他のクライアント側言語と同じだと思います。リテラル整数の代わりに、データベース対応コントロールの一部のプロパティ、おそらく「値」または「テキスト」プロパティを参照します。そして、ボタンの「クリック」イベントでトランザクションを実行します。

Delphiが十分に「データ認識」している場合(Accessのネイティブコントロールのように、データベースの列と行にバインドされているコントロールを使用している場合)、SQLを実行したり、dbmsの自動ID番号を保存するために特別なことをしたりする必要はありません。生成します。コントロールのプロパティの1つからアクセスできます。(Accessのフォームとコントロールは、データを高度に認識しています。そのよう機能します。)ただし、必要に応じて、AccessにMicrosoftのOLEDBプロバイダーを使用している場合はselect @@identity、接続で使用される最後のID番号を取得するために使用できます。

于 2012-06-17T19:42:53.797 に答える
1

SQLを使用している場合は、次のようにします(擬似コード)

startTransaction;
INSERT INTO Book VALUES('Book1');
bookID:=SELECT LastAutoInc FROM #Dummy;
INSERT INTO Author VALUES('Author1');
authorID:=SELECT LastAutoInc FROM #Dummy;
INSERT INTO BookAuthor VALUES(bookID, autherID);
commit;

重要なのは、トランザクション内LastAutoIncでの関数(またはデータベース内の同等の関数)の使用です。

于 2012-06-18T01:06:42.143 に答える