Добравшись до своего офиса, я решил протестировать 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();
}
}