¿Por qué este inserto masivo oracle no funciona?

Estoy tratando de insertar en masa algunos datos en un oráculo db. Seguí el ejemplo en la documentación.

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();
}

Pues no funciona. No se inserta nada en la base de datos, no recibo ningún mensaje de error.

Todo funciona bien cuando no utilizo la inserción masiva (en cambio, paso por cada fila de mis tablas de datos e inserto la fila de datos en la base de datos en cada iteración).

ACTUALIZACIÓN: He seguido las sugerencias y realizado los siguientes cambios en mi parámetro.

var nameParam = new OracleParameter
    {
        ParameterName = ":name",
        OracleDbType = OracleDbType.Varchar2,
        Value = names,
        Size = table.Rows.Count,
        CollectionType = OracleCollectionType.PLSQLAssociativeArray,
        Direction = ParameterDirection.Input
    }; 

Me sale este error:

System.InvalidCastException: no se puede convertir un objeto del tipo 'System.String' para escribir 'System.Array'.
en Oracle.DataAccess.Client.OracleParameter.SetStatus (Int32 arraySize)
en Oracle.DataAccess.Client.OracleParameter.ResetCtx (Int32 arraySize)
en Oracle.DataAccess.Client.OracleParameter.PreBind (conexión OracleConnection, IntPtr errCtx, Int32 arraySize)
en Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery ()
en Gateway.DataGateway.Import (String connString, Product product) en \ path \ share $ \ Visual Studio 2010 \ Projects \ ImportData-trunk \ Gateway \ DataGateway.Sql.cs: línea 196

ACTUALIZACIÓN2: el controlador ODP.NET es estúpido (simplemente no funciona como lo expliqué;)

esto no funciona

var names = new List<string>();

tiene que ser esto

var names = new string[table.Rows.Count];

Respuestas a la pregunta(3)

Su respuesta a la pregunta