Как выполнить различные множественные операторы SQL с помощью OracleCommand C # - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь выполнить различные операторы SQL с помощью OracleCommand.

var conn = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource");
// Open the connection
if (conn.State != ConnectionState.Open)
    conn.Open();

string sql = @"
    DROP TABLE CUSTOMERS;

    CREATE TABLE CUSTOMERS (
        ID INT NOT NULL PRIMARY KEY,
        NAME VARCHAR(12) NOT NULL,
        AGE INT,
        ADDRESS VARCHAR(12)
    );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY');

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA');

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (3, 'Andy', 48, 'CA');

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (4, 'Allan', 53, 'LA');
";

var cmd = new OracleCommand(sql, conn);
try
{
    cmd.ExecuteNonQuery();
}
catch (OracleException e)
{
    error = e.Message;
}
finally
{
    if (conn.State == ConnectionState.Open)
    {
        conn.Close();
    }
}

Я получаю следующее исключение.

ORA-00933: команда SQL неправильно завершена

Когда я заключаю несколько операторов в блок BEGIN, END, я получаю следующее исключение.

ORA-06550: строка 2, столбец 1: PLS-00103: найденосимвол "DROP" при ожидании одного из следующих действий:

(начинайте регистр, объявляйте выход для goto, если цикл mod null pragma повышение возвращают select update, в то время как с << продолжить закрыть текущий удалить выборку блокировка вставить открытый откат сохранить точку сохранения set sqlвыполнить фиксацию для полной очистки канала слияния json_exists json_value json_query json_object json_array </p>

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Может быть, лучше использовать команду для каждого оператора. Ниже приведен пример с dapper .

  const string dropTableCustomers = "DROP TABLE CUSTOMERS";

  const string createTableCustomers = @"    
    CREATE TABLE CUSTOMERS (
    ID INT NOT NULL PRIMARY KEY,
    NAME VARCHAR(12) NOT NULL,
    AGE INT,
    ADDRESS VARCHAR(12))";

  const string insertCustomerMark = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')";
  const string insertCustomerJohn = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')";

  using (var connection = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource")) {
    connection.Open();

    connection.Execute(dropTableCustomers);
    connection.Execute(createTableCustomers);
    connection.Execute(insertCustomerMark);
    connection.Execute(insertCustomerJohn);
  }

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

  public static class DbConnectionFactory {
    public static IDbConnection Create(string connectionString) {
      var connection = new OracleConnection(connectionString);
      connection.Open();

      return connection;
    }
  }


  const string dropTableCustomers = "DROP TABLE CUSTOMERS";

  const string createTableCustomers = @"    
    CREATE TABLE CUSTOMERS (
    ID INT NOT NULL PRIMARY KEY,
    NAME VARCHAR(12) NOT NULL,
    AGE INT,
    ADDRESS VARCHAR(12))";

  const string insertCustomerMark = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')";
  const string insertCustomerJohn = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')";

  using (var connection = DbConnectionFactory.Create("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource"))
  using (var transaction = connection.BeginTransaction()) {

    connection.Execute(dropTableCustomers);
    connection.Execute(createTableCustomers);
    connection.Execute(insertCustomerMark);
    connection.Execute(insertCustomerJohn);

    transaction.Commit();
  }
0 голосов
/ 10 апреля 2019

Выполнить немедленно даст вам возможность выполнить более одного оператора.

OracleConnection con = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource");  

if (con.State != ConnectionState.Open)
    con.Open();

OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText =
    "begin " +
    "  execute immediate 'DROP TABLE CUSTOMERS';" +
    "  execute immediate 'CREATE TABLE CUSTOMERS (ID INT NOT NULL PRIMARY KEY,NAME VARCHAR(12) NOT NULL, AGE INT, ADDRESS VARCHAR(12))';" +
    "  execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')';" +
    "  execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')';" +
    "  execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (3, 'Andy', 48, 'CA')';" +
    "  execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (4, 'Allan', 53, 'LA')';" +
    "end;"
cmd.CommandType = CommandType.Text;
try
{
    cmd.ExecuteNonQuery();
}
catch (OracleException e)
{
    error = e.Message;
}
finally
{
    if (con.State == ConnectionState.Open)
    {
        con.Close();
    }
}
...