Параметризованные запросы C # для Oracle - серьезная и опасная ошибка!

Это абсолютный вопль . Я не могу поверить своим глазам и не могу поверить, что никто до меня не обнаружил бы это, если бы это была настоящая ошибка в C #, поэтому я предлагаю это остальному сообществу разработчиков, чтобы сказать мне, что я делаю неправильно. Я уверен, что этот вопрос заставит меня сказать "DOH!" и очень сильно ударил себя по голове ладонью - но все равно здесь ...

Ради тестирования я создал таблицу Test_1 со следующим скриптом:

CREATE TABLE TEST_1 (
  COLUMN1 NUMBER(12) NOT NULL,
  COLUMN2 VARCHAR2(20),
  COLUMN3 NUMBER(12))
TABLESPACE USERS
STORAGE (
  INITIAL 64K
  MAXEXTENTS UNLIMITED
)
LOGGING;

Теперь я выполняю следующий код:

var conn = new OracleConnection("connectionblahblah");
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = 
  "insert into Test_1(Column1, Column2, Column3) " +
  "values(:Column1, :Column2, :Column3)";
var p = cmd.Parameters;
p.Add("Column1", 1);
p.Add("Column3", null);
p.Add("Column2", "record 1");
cmd.ExecuteNonQuery();

Ого! Я получаю ошибку ORA-01722 - "неверный номер"! Но что случилось? Столбец1 является числовым и имеет значение 1, так что ничего страшного; Столбец2 - это строка, а Столбец 3 - столбец, допускающий значение NULL, так что это не должно вызвать никаких проблем ...

А теперь займитесь этим ... проблема здесь состоит в том, что Column3 и Column2 транспонируются в том порядке, в котором они добавляются в OracleParameterCollection . Поменяйте их местами, и готово! Это работает!

Это, конечно же, приводит меня к следующему очевидному эксперименту ... давайте изменим этот блок кода для добавления параметров следующим образом:

p.Add("Foo", 1);
p.Add("Bar", "record 1");
p.Add("hahahahahahaha", null);

Вы думаете, что это сработает? Угадайте, что - он делает !

Я сижу здесь совершенно ошеломленный. Я не могу поверить в то, что вижу, и я точно так же не могу поверить, что никто до меня не обнаружил это поведение (если только я не знаю, как правильно использовать Google).

Это не просто раздражает - это серьезно опасно. Что бы произошло, если бы я переставил два столбца с одинаковым типом данных? У меня даже не было бы ошибки - я бы просто вставил неправильные данные в неправильные столбцы и не стал бы мудрее.

Есть ли у кого-нибудь какие-нибудь идеи по обходному пути - кроме того, чтобы просто не добавлять параметры в неправильном порядке?

36
задан OMG Ponies 17 April 2011 в 01:57
поделиться