J'essaye d'insérer en bloc quelques données dans un oracle db. J'ai suivi l'exemple dans la documentation.Pourquoi cet insert vrac Oracle ne fonctionne-t-il pas?
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();
}
Eh bien, cela ne fonctionne pas. Rien n'est inséré dans la base de données, je ne reçois aucun message d'erreur. Tout fonctionne correctement lorsque je n'utilise pas l'insertion en bloc (à la place, je foreach-boucle à travers chaque ligne de mes DataTables et insérer le DataRow dans la base de données à chaque itération). MISE À JOUR: J'ai suivi les suggestions et apporté les modifications suivantes à mon paramètre.
var nameParam = new OracleParameter
{
ParameterName = ":name",
OracleDbType = OracleDbType.Varchar2,
Value = names,
Size = table.Rows.Count,
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Direction = ParameterDirection.Input
};
Je reçois cette erreur:
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Array'.
at Oracle.DataAccess.Client.OracleParameter.SetStatus(Int32 arraySize)
at Oracle.DataAccess.Client.OracleParameter.ResetCtx(Int32 arraySize)
at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
at Gateway.DataGateway.Import(String connString, Product product) in \path\share$\Visual Studio 2010\Projects\ImportData-trunk\Gateway\DataGateway.Sql.cs:line 196
MAJ2: Le pilote ODP.NET est stupide (juste ne fonctionne pas comme j'exprected;)
cela ne fonctionne pas
var names = new List<string>();
cela doit être cela
var names = new string[table.Rows.Count];
Je ne sais pas pourquoi cela ne fonctionne pas, mais vous devriez essayer une ligne par ligne insérer d'abord pour voir si cela fonctionne. Aussi, avez-vous payé assez d'argent à Oracle? Cela pourrait faire partie du problème. ;) – poindexter12
Il fonctionne rangée par rangée et mon employeur a payé oracle assez d'argent;) – mrt181
c'est juste ce qui se passe quand vous avez une forte excrétion. –