Вставить в Oracle Data Access с C # - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь вставить в таблицу оракула этот код и выдает это сообщение об ошибке: «Значение не соответствует ожидаемому диапазону.»

Я пробовал разные способы, но всегда выдает одну и ту же ошибку.

oc.Open();

OracleDataAdapter oda = new OracleDataAdapter();



OracleCommand cmd = new OracleCommand("INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) " +
   "VALUES (:pROW_ID, :pCREATED, :pSTATUS", oc);


OracleParameter ROW_ID = new OracleParameter("pROW_ID", OracleDbType.Varchar2, 15, "ROW_ID");
OracleParameter CREATED = new OracleParameter("pCREATED", OracleDbType.Date, 30, "CREATED");
OracleParameter STATUS = new OracleParameter("pASIGNADO", OracleDbType.Varchar2, 15, "STATUS");
ROW_ID.Value = BDOracleObtenerRowIDBackOffice();

ROW_ID.Value = = "146721030020001";
CREATED.Value = "SYSDATE";
STATUS.Value = "ON_HOLD";

cmd.Parameters.Add("pROW_ID", ROW_ID);  //<-- Here throws exception
cmd.Parameters.Add("pCREATED", CREATED);
cmd.Parameters.Add("pSTATUS", STATUS);

oda.InsertCommand = cmd;

Трассировка: в Oracle.ManagedDataAccess.Client.OracleParameter..ctor (String parameterName, Object obj) в Oracle.ManagedDataAccess.Client.OracleParameterCollection.Add (имя строки, значение объекта) в TestCore.MyClass.functionInsert (параметр String) в C: \ Users \ user_01 \ source \ repos \ file.cs: línea 2945

1 Ответ

2 голосов
/ 28 марта 2019

У меня есть нечто похожее в приложении, над которым я работаю. Этого должно быть достаточно для обзора, но вы, возможно, захотите изменить имена и значения параметров по сравнению с теми, которые мне нужны, когда вы добавите параметр Oracle к cmd.

.
using(var conn = new OracleConnection("CONNECTIONSTRING")
{
   conn.Open();

   var cmd = conn.CreateCommand();
   cmd.CommandText = "INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) VALUES (:pROW_ID, :pCREATED, :pSTATUS");

   cmd.CommandType = CommandType.Text;

   cmd.Parameters.Add(":pROW_ID", OracleDbType.whateverType, "146721030020001", ParameterDirection.Input);
   cmd.Parameters.Add(":pCREATED", OracleDbType.whateverType, "SYSDATE", ParameterDirection.Input);
   cmd.Parameters.Add(":pASIGNADO", OracleDbType.whateverType, "ON_HOLD", ParameterDirection.Input);

   cmd.ExecuteNonQuery();
   conn.Close();
}

Примечание. Если ROW_ID является PK и имеет последовательность для автоматической генерации значения, вам нужно использовать связанную с ним последовательность вместо передачи параметра:

cmd.CommandText = "INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) VALUES (NAME_OF_SEQUENCE.nextval, :pCREATED, :pSTATUS");

Еще одно замечание: если вы хотите выполнять массовые вставки вместо отдельных строк, я настоятельно рекомендую использовать привязку к массиву: http://burnignorance.com/database-tips-and-tricks/bulk-copy-with-oracle-using-array-binding/ производительность довольно велика для больших наборов данных.

В отношении "The value is not within the expected range." дважды проверьте значение по отношению к столбцу в базе данных, чтобы убедиться, что оно допустимо, и затем используйте правильный OracleDbType, который соответствует ему.

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