2013/06/01(Sat) 21:36:08 編集(投稿者)
WebSurferさん、返信有難うございました。
>>具体的には以下のページの「リスト 6 非接続データアクセスでの更新サンプル」
>>を見てください。
>>DB 設計者のための明解 ADO.NET 第 1 回
>>http://msdn.microsoft.com/ja-jp/events/dd231281.aspx
参照のWEBサイト有難うございます。まだプログラム自体が初心者域なので
分からない事がおおくて・・・ゆっくりみたいと思います。
実は、DataAdapterで自動で生成されるUpdateCommandやDeleteCommandの楽観的排他制御というのが
都合がわるくて自前でクエリを設定しています。
ADO.NETならOracleDataAdapter.ConflictOption = ConflictOption.OverwriteChangesが効いてくれて
問題なかったのですが、ODP.NETはまだ実装されてないらしく、今回このような事をしようかと思って
おります。
プログラムは一部抜粋して以下の様に行っています。
int i;
OracleDataAdapter adaper = this.createDataAdapter(tableName,table);
i = adaper.Update(table);
private OracleDataAdapter createDataAdapter(string tableName,DataTable dt)
{
OracleCommand selectCommand =
new OracleCommand(string.Format("SELECT * FROM {0}", tableName),
this._Connection);
selectCommand.Transaction = this._Transaction;
OracleDataAdapter adaper = new OracleDataAdapter(selectCommand);
OracleCommandBuilder builder = new OracleCommandBuilder(adaper);
adaper.InsertCommand = builder.GetInsertCommand();
adaper.UpdateCommand = getUpdateCommand(tableName); //スキーマーからUpdateCommandを生成しています。
adaper.UpdateCommand.BindByName = true;
adaper.UpdateCommand.Parameters.AddRange(getUpdateParamater(tableName,dt).ToArray()); //※1
adaper.DeleteCommand = GetDeleteCommmand(tableName); //スキーマーからDeleteCommandを生成しています。
adaper.DeleteCommand.BindByName = true;
adaper.DeleteCommand.Parameters.AddRange(getDeleteParamater(tableName,dt).ToArray()); //※2
adaper.SelectCommand.Connection = this._Connection;
adaper.InsertCommand.Connection = this._Connection;
adaper.UpdateCommand.Connection = this._Connection;
adaper.DeleteCommand.Connection = this._Connection;
return adaper;
}
//UpdateParamaterの取得
private List<OracleParameter> getUpdateParamater(string tableName,DataTable dt)
{
List<OracleParameter> l = new List<OracleParameter>();
OracleCommand oracmd =
new OracleCommand(string.Format("SELECT * FROM {0}", tableName),
this._Connection);
OracleDataReader r = oracmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly);
DataTable tbl = r.GetSchemaTable();
foreach(DataRow dr in tbl.Rows)
{
OracleParameter prm = new OracleParameter(dr["ColumnName"].ToString(), //※3ここがわかりません。。
l.Add(prm);
}
return l;
}
ここで、UpdateCommandとDeleteCommandを自前で作っているのでUpdateとDeleteはParameterを設定してあげないと
いけないと思っており※1と※2のメソッドは作ったのですが、※3の所に何のObjectを入れていいかさっぱりです。。
adapter.Update(Datarow)ならば、単純にValueを入れればいいのでしょうが・・。
知識不足で申し訳ないです。お力お貸しください。