Используя C #, как добавить триггеры и индексы в таблицу базы данных Oracle? - PullRequest
0 голосов
/ 29 октября 2019

Как можно было бы создать триггеры для таблицы Oracle в C #? Версия Oracle, с которой я работаю, - 11g. Я могу запустить команду Oracle, которая создаст таблицу, в C #. Но я не могу создать триггеры и добавить индексы, так как им требуется точка с запятой, и когда я запускаю команды оракула в C # с точкой с запятой в командной строке, я получаю сообщение об ошибке.

Запуск командных строк Oracle в C #,которые добавляют триггеры и индексы.

var createCommand = "CREATE TABLE TESTTABLE (TESTSTRING VARCHAR(20))";

var alterTable = "ALTER TABLE TESTTABLE  ADD( CONSTRAINT TESTID PRIMARY KEY(id) );";

var combined = createCommand + alterTable;

    using (var connection = Database.GetConnection())
    {
        using (var command = Database.GetCommand(combined , connection, CommandType.Text))
        {
            try
            {
                command.ExecuteNonQuery();
            }
            catch(Exception ex)
            {

            }
        }
    }
}

В базе данных должна появиться таблица с именем TESTTABLE.

1 Ответ

0 голосов
/ 29 октября 2019

Добравшись до своего офиса, я решил протестировать Oracle (я знаю ";", по крайней мере, работает с SQL Server. К сожалению, реализация ODP.Net не позволяет этого. Поэтому у вас есть две возможности: либо обернуть свои операторы впакет, помеченный BEGIN и END;, с отдельными командами, начинающимися с EXECUTE IMMEDIATE '.. your command here ..';, или вы можете повторно использовать команду, изменив CommandText и повторно выполнив.

Кстати, вашУ SQL была и другая проблема: вы пытались создать первичный ключ для столбца, который не был включен в вашу таблицу создания!

Ниже приведен пример с использованием обоих методов. Обратите внимание, что я ограничениспользуйте конкретную схему для моих таблиц (отсюда и дополнительные "feosi."). Также обратите внимание, что в альтернативном примере нет точек с запятой: их включение приводит к недопустимому исключению символа.

var createCommand = "execute immediate 'CREATE TABLE FEOSI.TESTTABLE (ID int, TESTSTRING VARCHAR(20))';";

var alterTable = "execute immediate 'ALTER TABLE FEOSI.TESTTABLE  ADD( CONSTRAINT TESTID PRIMARY KEY(ID) )';";

var combined = "BEGIN " + createCommand + alterTable + "END;";

var altCreateCommand = "CREATE TABLE FEOSI.TESTTABLE2 (ID int, TESTSTRING VARCHAR(20))";
var altAlterTable = "ALTER TABLE FEOSI.TESTTABLE2  ADD( CONSTRAINT TESTID2 PRIMARY KEY(ID) )";

using (OracleConnection oracleConn = new OracleConnection(myOracleConnStr))
{
    oracleConn.Open();
    using (OracleCommand oracleCmd = new OracleCommand(combined, oracleConn))
    {
        //Do everything in one batch
        oracleCmd.CommandType = CommandType.Text;
        oracleCmd.ExecuteNonQuery();

        //alternative re-use Command
        oracleCmd.CommandText = altCreateCommand;
        oracleCmd.ExecuteNonQuery();

        oracleCmd.CommandText = altAlterTable;
        oracleCmd.ExecuteNonQuery();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...