Вставить в 3 таблицы на основе порядкового номера из первой вставки в C # - PullRequest
1 голос
/ 19 февраля 2011

У меня есть 3 таблицы в базе данных Oracle. На моей странице asp.net C # я вставляю записи во все три таблицы, как показано ниже:

INSERT INTO contactMaster
   (contactID, FName, MName, LName) 
VALUES
   (contactID.NextVal, 'John', 'G', 'Garnet')

INSERT INTO contactPhone
  (contactPhoneID, contactID, contactType, phonenum)     
VALUES
  (contactPhoneID.NextVal, 1, 2, 1234567890)

INSERT INTO contactAddress
  (contactAddressID, contactID, addressType, PHN, Street, City)
VALUES
  (contactAddressID.NextVal, 1, 1, 287, 'Blooper St', 'New Yor')

Мой вопрос: как мне убедиться, что все вышеперечисленное выполнено или ни одно из них не выполнено в C #.

Если первая 2-я или 3-я вставка не удалась, все должно завершиться неудачей.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Использование транзакции SQL для обеспечения атомарности:

public void RunOracleTransaction(string connectionString) {
  using (OracleConnection connection = new OracleConnection(connectionString))
  {
    connection.Open();

    OracleCommand command = connection.CreateCommand();
    OracleTransaction transaction;

    // Start a local transaction
    transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
    // Assign transaction object for a pending local transaction
    command.Transaction = transaction;

    try
    {
        command.CommandText = 
            "INSERT INTO contactMaster
               (contactID, FName, MName, LName) 
             VALUES
               (contactID.NextVal, 'John', 'G', 'Garnet')";
        command.ExecuteNonQuery();

        command.CommandText = 
            "INSERT INTO contactPhone
               (contactPhoneID, contactID, contactType, phonenum)     
             VALUES
               (contactPhoneID.NextVal, 1, 2, 1234567890)";
        command.ExecuteNonQuery();

        command.CommandText = 
            "INSERT INTO contactAddress
               (contactAddressID, contactID, addressType, PHN, Street, City)
             VALUES
               (contactAddressID.NextVal, 1, 1, 287, 'Blooper St', 'New Yor')";
        command.ExecuteNonQuery();

        transaction.Commit();
        Console.WriteLine("Both records are written to database.");
    }
    catch (Exception e)
    {
        transaction.Rollback();
        Console.WriteLine(e.ToString());
        Console.WriteLine("Neither record was written to database.");
    }
  }
}

C #: OracleTransaction

Альтернативный

Операторы вставки могут быть перемещены в хранимую процедуру (предпочтительно внутри пакета), поэтому из C # можно сделать только один запрос.

1 голос
/ 21 февраля 2011

Еще одна идея - вы можете сделать вставки, используя одну инструкцию INSERT, например:

INSERT ALL
INTO contactMaster
   (contactID, FName, MName, LName) 
VALUES
   (contactID, FName, MName, LName)
INTO contactPhone
  (contactPhoneID, contactID, contactType, phonenum)     
VALUES
  (contactPhoneID.NextVal, contactID, contactType, phonenum)
INTO contactAddress
  (contactAddressID, contactID, addressType, PHN, Street, City)
VALUES
  (contactAddressID.NextVal, contactID, addressType, PHN, Street, City)
(SELECT contactID.NextVal AS contactID,
        'John' AS FName,
        'G' AS MName,
        'Garnet' AS LName,
        2 AS contactType,
        1234567890 AS phonenum,
        1 AS addressType,
        287 AS PHN,
        'Blooper St' AS Street,
        'New Yor' AS City
 FROM   dual)

Кстати, похоже, что ваши оригинальные вставки страдают от проблемы, что contactID всегда 1 независимо от того, какая последовательность сгенерирована для contactMaster.contactID.Если вы хотите использовать отдельные INSERT для каждой таблицы, вы можете получить последнее сгенерированное значение, обратившись к contactID.CurrVal.

0 голосов
/ 19 февраля 2011

Перед первой командой запустите транзакцию :

start transaction

После последней команды совершите транзакцию:

commit transaction

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

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