Мне пришлось использовать метод ToArray () в списке.

аюсь массово вставить некоторые данные в оракул БД. Я последовал примеру в документации.

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];

Ответы на вопрос(3)

Ваш ответ на вопрос