Как вставить данные? - PullRequest
       9

Как вставить данные?

0 голосов
/ 25 апреля 2009

Как я могу вставить данные в несколько таблиц базы данных Access, которые имеют внутреннее соединение, используя C #?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2009

Я согласен, что вопрос неопределенный, но подразумевает часто задаваемый вопрос для механизма ACE / Jet: «Если я могу создать INNER JOIN между двумя таблицами, могу ли я INSERT в обе таблицы с помощью одного оператора SQL?» обычно за ним следует квалификатор "... и если между таблицами существует FOREIGN KEY (Access = отношение с соблюдением ссылочной целостности), можно ли автоматически добавить сгенерированный номер INDENTITY / AutoNumber в указанной таблице справочная таблица?

Ответ на на эти вопросы - да: создайте VIEW с INNER JOIN (или эквивалентным), включая столбец IDENTITY и столбец, ссылающийся на столбец IDENTITY, затем INSERT INTO VIEW пропускает столбец IDENTITY и его столбец ссылок.

Вот краткий пример синтаксиса режима запросов ANSI-92 (я предполагаю, что вы используете OLE DB):

CREATE TABLE TableA
(
   ID IDENTITY NOT NULL UNIQUE, 
   a_col INTEGER NOT NULL
)
;

CREATE TABLE TableB
(
   ID INTEGER NOT NULL UNIQUE
      REFERENCES TableA (ID),  
   b_col INTEGER NOT NULL
)
;

CREATE VIEW TestAB
(
   a_ID, a_col, 
   b_ID, b_col
)
AS 
SELECT A1.ID, A1.a_col, 
       B1.ID, B1.b_col
  FROM TableA AS A1
       INNER JOIN TableB AS B1
          ON A1.ID = B1.ID
;

INSERT INTO TestAB (a_col, b_col) VALUES (55, 99)
;
0 голосов
/ 25 апреля 2009

Я предполагаю, что под присоединением вы подразумеваете связь с внешним ключом к другой таблице. Объединения относятся к запросам, а не к таблицам.

Вы можете просто сделать несколько вставок, по одной в каждую таблицу, как требуется, добавить запись в родительскую таблицу, получить ключ новой записи, которую вы только что добавили, а затем выполнить вставку в любые дочерние таблицы, используя этот идентификатор, который будет внешний ключ в дочерней таблице.

0 голосов
/ 25 апреля 2009

По моему опыту, стандартного способа не существует, но есть обходные пути, которые зависят от структуры ваших таблиц / базы данных.

Я не уверен, что Access поддерживает триггеры, SP и функции. Я считаю, что нет, поэтому следующие обходные пути не действительны, если это правда.

  1. Вы можете использовать триггер для дочерней таблицы, но если у вас есть ограничения внешнего ключа, которые не будут работать, так как вы можете в конечном итоге вставить значения в дочернюю таблицу, которых нет в родительской. Наличие триггера для родителя бесполезно, поскольку вы не можете передавать аргументы триггерам.

  2. Еще один обходной путь может заключаться в том, что вы вызываете процедуру сохранения из вашего внешнего приложения, а из этой процедуры хранения вы вызываете несколько операторов вставки. Однако из вашего вопроса я не делаю вывод, что вы не готовы сделать это, поскольку в вопросе говорится «из единого оператора вставки».

  3. Еще один обходной путь - это то, что похоже на триггерный подход, который заключается в определении функции, и вы можете вызывать функцию из запроса вставки. С помощью функции вы вставляете данные в дочернюю таблицу. Но опять же, если есть какое-либо ограничение целостности, вы можете столкнуться с той же проблемой, что и в случае триггеров. Поскольку функции будут запускаться в первую очередь до того, как произойдет вставка.

  4. Еще один подход; создайте таблицу, которая представляет собой объединение полей из требуемой таблицы (для справки давайте назовем ее корневой таблицей). Затем вы определяете триггер для вставки в эту таблицу. Теперь вставьте записи в эту корневую таблицу и в триггер вставьте соответствующие поля в нужную вам таблицу. (Вам нужно будет использовать транзакции в триггерах для атомарности).

Предположим, у вас есть структура таблицы liek emp (empid, name); empContacts (ContactID, EmpID, номер); empAddress (AddressID, EmpID, адрес); поэтому вы создаете другую таблицу, которая представляет собой объединение полей из emp, и empContacts называют его Rootemp (empid, name, contactctid, number, addressId, address);

Создайте триггер для этой таблицы и изнутри записей вставки триггера в таблицы emp, empContacts и empAddress с транзакцией.

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

Возможно, это не лучший вариант, потому что обходной путь никогда не должен быть.

PS: пример emp, empContact и empAdress может быть не очень удачным примером, но я надеюсь, что он действительно передал сообщение.

0 голосов
/ 25 апреля 2009

Я не знаю, работает ли он в Access, но вы можете попробовать:

INSERT INTO table (col1, col2, col3)
SELECT t1.col1, t1.col2, t2.col3
FROM table1 t1
INNER JOIN table2 t2 ON t1.Id = t2.Id

Если вам нужно сделать это для разных таблиц, сделать разные вставки, JET Engine не разрешает множественные запросы для одного оператора, согласно здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...