Почему точка с запятой не может быть помещена в CommandText OracleCommand, когда C # - PullRequest
4 голосов
/ 02 июня 2011

Почему точка с запятой (';') не может быть помещена в CommandText OracleCommand, когда C #

Как показано ниже:

string sql = "select * from table1;";
OracleCommand oc = new OracleCommand(sql , con);
oc.CommandType = CommandType.Text;
oc.ExecuteNonQuery();

Результат окажется ошибкой.

Почему? Кто-нибудь может сказать мне причину?

1 Ответ

9 голосов
/ 02 июня 2011

В комментариях мы разработали ответ для вас. Чтобы вы получили официальный «ответ», вот он с сайта OracleOverflow (см. Ниже):

OracleCommmand может одновременно выполнять только 1 оператор sql или plsql. Нет необходимости разделять несколько операторов.

Точка с запятой является частью документации для разделения нескольких операторов. Это не часть единого оператора DDL. Для OracleCommand нет необходимости добавлять точку с запятой, потому что он может обрабатывать только один оператор за раз.

Редактировать: это была исходная ссылка, которая теперь не работает: http://www.oracleoverflow.com/questions/145/running-ddl-through-an-oraclecommand-without-the-semicolon

Альтернатива: http://web.archive.org/web/20100806014022/http://www.oracleoverflow.com/questions/145/running-ddl-through-an-oraclecommand-without-the-semicolon

Вопрос:

При попытке запустить серию команд DDL через OracleCommand объект, я получаю ORA-00911 «недопустимый символ», если я включаю последняя точка с запятой, хотя это часть синтаксиса SQL в документация. Это также означает, что вы можете выполнить только один SQL оператор за раз, вместо того, чтобы выполнять весь сценарий SQL одновременно, что мне кажется очень странным.

Немного погуглив, я обнаружил, что обходной путь - обернуть DDL в инструкции EXECUTE IMMEDIATE PL / SQL, но, опять же, он завершится неудачно, если DDL имеет точку с запятой в конце (кроме операторов создания PL / SQL, которые требуют точки с запятой).

Кто-нибудь знает причину такого поведения? Точка с запятой находится в синтаксическая документация, поэтому я бы предположил, что это всегда требуется, но не получается, если точка с запятой включена ...

Ответ здесь:

OracleCommmand может одновременно выполнять только 1 оператор sql или plsql. Нет необходимости разделять несколько операторов.

Точка с запятой является частью документации для разделения нескольких операторов. Это не часть единого оператора DDL. Для OracleCommand есть нет необходимости добавлять точку с запятой, потому что она может обрабатывать только один заявление за один раз.

ДОБАВЛЕНО: Вы можете связать более одного оператора в BEGIN ... END; Блок (да, это заканчивается точкой с запятой). Но это заявления должны быть Вызовы функций DML, DDL или PL / SQL. Вы не можете связать несколько SELECT заявления в НАЧАЛО ... КОНЕЦ; Блок.

Комментарии:

Почему OracleCommand имеет такое ограничение, что может запускать только 1 оператор за раз?

Он основан на спецификации DbCommand в ADO.Net. Это не только ограничение OracleCommand.

SqlCommand допускает несколько операторов в одной команде, которая должна быть просто «дополнением» для SQL Server.

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