これをC#でプログラミングするには、最善の方法が必要です。私はレコードが存在するかどうかを確認しようとしています更新ステートメントelseステートメントを挿入、更新されたコードがまだ挿入/更新データベースに問題があります。このコードから実行後のデータベースには何も表示されません。レコードが存在する場合にヘルプが必要な場合その他の更新方法
String updCmdTxt = "UPDATE..";
String insertCmdTxt = "INSERT ..";
using (var scope = new TransactionScope())
{
using (var con = new OracleConnection(strConnection))
{
bool isDuplicate = false;
var insertcmd = new OracleCommand(insertCmdTxt, con);
try
{
con.Open();
......add params
insertcmd.ExecuteNonQuery();
con.Close();
Response.Redirect("test.aspx?Id=" + labelRID.Text);
}
catch (OracleException x)
{
isDuplicate = true; //determine if the exception is about duplicates.
if (!isDuplicate)
{
throw;
}
}
finally
{
insertcmd?.Dispose();
}
if (isDuplicate)
{
using (var updcmd = new OracleCommand(updCmdTxt, con))
{
....
updcmd.ExecuteNonQuery();
}
}
scope.Complete();
Response.Redirect("test.aspx?Id=" + labelRID.Text);
}
}
}
これをプログラムするには、より良い方法がありますか?
2つのこと:1.あなたの 'rid'フィールドには一意制約があることを確認してください。 2.あなたの 'else'ブロック(' INSERT'オペレーション)で 'duplicate row exception'をキャッチして処理します。これらの問題は、最初のチェック「SELECT COUNT」と挿入/更新操作の間に別のクライアント/接続/スレッドが既に挿入を行った可能性がある場合に問題となります。 –
最適化:カウントのチェックに使用した同じ接続を挿入または更新するために再利用することもできます。最後に挿入された行から自動インクリメントされたIDを取得する場合、別のスレッドで接続が使用されていないことを確認する必要があります。 –
oracle merge文で希望することができます –