一部のデータをoracle dbにバルク挿入しようとしています。私はドキュメンテーションの例に従った。このOracleのバルク挿入が機能しないのはなぜですか?
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();
}
これはうまくいきません。データベースに何も挿入されていないため、エラーメッセージは表示されません。
一括挿入を使用しないと(すべてのデータテーブルから各行をforeachループし、各繰り返しでデータベースにDataRowを挿入すると)すべてが正常に機能します。
更新:私は提案に従って、私のパラメータに以下の変更を加えました。
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
アップデート2:
var nameParam = new OracleParameter
{
ParameterName = ":name",
OracleDbType = OracleDbType.Varchar2,
Value = names,
Size = table.Rows.Count,
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Direction = ParameterDirection.Input
};
は、私はこのエラーを取得するODP.NETドライバは愚かである(私はexprectedとしてだけでは動作しません。)
これは
var names = new List<string>();
動作しません。
これはこれである必要があります
var names = new string[table.Rows.Count];
これが動作しない理由を確認していますが、それが動作するかどうかを確認するために最初に挿入し、行ごとにしようとしなければならないわけではありません。また、オラクルに十分なお金を支払ったことはありますか?それは問題の一部になる可能性があります。 ;) – poindexter12
それは行ごとに動作し、私の雇用者は十分なお金を払っていた;) – mrt181
これは、あなたが高い失踪を経験したときに起こることです。 –