Я пытаюсь массово вставить некоторые данные в базу данных оракула. Я последовал примеру в документации.
this.DataBaseAccess = new OracleConnection(connString);
var dataAdapter = new OracleDataAdapter();
var insertCmd = DataBaseAccess.CreateCommand();
insertCmd.CommandType = CommandType.Text;
insertCmd.BindByName = true;
var names = new List<string>();
foreach (DataTable table in product.Contracts.Tables)
{
foreach (DataRow row in table.Rows)
{
names.Add(row["Contract"].ToString());
}
const string InsertContracts = "merge into CONTRACT t " +
"using " +
"(select :name NAME from dual) s " +
"on (t.NAME = s.NAME) " +
"when not matched then " +
"insert (t.NAME) " +
"values (s.NAME)";
insertCmd.CommandText = InsertContracts;
insertCmd.ArrayBindCount = table.Rows.Count;
insertCmd.Parameters.Add(":name", OracleDbType.Varchar2, names, ParameterDirection.Input);
dataAdapter.InsertCommand = insertCmd;
this.DataBaseAccess.Open();
insertCmd.ExecuteNonQuery();
this.DataBaseAccess.Close();
}
Ну, это не работает. Ничего не вставлено в базу данных, я не получаю никаких сообщений об ошибках.
Все работает нормально, когда я не использую массовую вставку (вместо этого я выполняю циклический цикл по каждой строке из моей таблицы данных и вставляю DataRow в базу данных на каждой итерации).
ОБНОВЛЕНИЕ: я следовал советам и внес следующие изменения в свой параметр.
var nameParam = new OracleParameter
{
ParameterName = ":name",
OracleDbType = OracleDbType.Varchar2,
Value = names,
Size = table.Rows.Count,
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Direction = ParameterDirection.Input
};
Я получаю эту ошибку:
System.InvalidCastException: невозможно преобразовать объект типа 'System.String' в тип 'System.Array'.
в Oracle.DataAccess.Client.OracleParameter.SetStatus (Int32 arraySize)
в Oracle.DataAccess.Client.OracleParameter.ResetCtx (Int32 arraySize)
в Oracle.DataAccess.Client.OracleParameter.PreBind (OracleConnection conn, IntPtr errCtx, Int32 arraySize)
в Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery ()
в Gateway.DataGateway.Import (String connString, Product product) в \ path \ share $ \ Visual Studio 2010 \ Projects \ ImportData-trunk \ Gateway \ DataGateway.Sql.cs: строка 196
ОБНОВЛЕНИЕ2: Драйвер ODP.NET тупой (просто не работает, как я понял;)
это не работает
var names = new List<string>();
должно быть это
var names = new string[table.Rows.Count];