C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 伝票更新登録


(過去ログ 129 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■76404 / inTopicNo.1)  伝票更新登録
  
□投稿者/ IceT (1回)-(2015/07/07(Tue) 13:42:33)

分類:[C#] 

皆様は伝票の更新時(登録済みの伝票を呼び出して、修正後再登録)の処理はどのようになさってるのでしょうか?
例えば、各行に修正フラグを設定し、修正した行のみをUpdate文で処理する。
もしくは、呼び出した伝票番号を先ず全削除し、新たに修正後の伝票をInsert文で全て処理する。

私は後者のほうが単純だと思い以下のように処理してみました。
using( var _conn = new FbConnection(sConnStr) )
{
  _conn.Open();
  using( FbTransaction _tran = _conn.BeginTransaction() )
  {
    using( FbCommand _cmd = _conn.CreateCommand() )
    {
      _cmd.Transaction = _tran;

      // 削除(Delete文の実行)
      _cmd.CommandText = sDelSQL;
      _cmd.ExecuteNonQuery();

      // 登録(リストに登録した各行のInsert文を実行)
      foreach( var sSQL in lstSQL)
      {
        _cmd.CommandText = sSQL;
        _cmd.ExecuteNonQuery();
      }
    }
    _tran.Commit();
  }
_conn.Close();

こんな感じで実行すると
violation of PRIMARY or UNIQUE KEY constraint "INTEG_365" on table "T_TABEL"
エラーになります。
トランザクション内でのDelete文とInsert文はだめなのでしょうか?
他によい手段があるのでしょうか?
どうぞよろしくおねがいします。
(visualstudio2012,win8pro,.NetFramework4.5)

引用返信 編集キー/
■76405 / inTopicNo.2)  Re[1]: 伝票更新登録
□投稿者/ WebSurfer (614回)-(2015/07/07(Tue) 14:48:03)
No76404 (IceT さん) に返信

> トランザクション内でのDelete文とInsert文はだめなのでしょうか?

そんなことはなくて、エラーメッセージ "violation of PRIMARY or UNIQUE KEY
constraint" が言う問題があるのではないですか? そのあたりは確認したでし
ょうか?
引用返信 編集キー/
■76406 / inTopicNo.3)  Re[2]: 伝票更新登録
□投稿者/ IceT (2回)-(2015/07/07(Tue) 16:02:53)
No76405 (WebSurfer さん) に返信
> ■No76404 (IceT さん) に返信
>
>>トランザクション内でのDelete文とInsert文はだめなのでしょうか?
>
> そんなことはなくて、エラーメッセージ "violation of PRIMARY or UNIQUE KEY
> constraint" が言う問題があるのではないですか? そのあたりは確認したでし
> ょうか?

お返事ありがとうございます。
色々検索するのですが、英語のページが多くて(汗
もう少し詳細に調べてみます。
引用返信 編集キー/
■76407 / inTopicNo.4)  Re[3]: 伝票更新登録
□投稿者/ しま (100回)-(2015/07/07(Tue) 17:22:00)
No76406 (IceT さん) に返信
> ■No76405 (WebSurfer さん) に返信
>>■No76404 (IceT さん) に返信
>>

トランザクション中に同一行への変更操作を複数行うとどうなるのでしょうか?

あなたは明確に書いていませんが、表 T_TABLE の INTEG_365 はユニークなキーになっていますね
(プライマリーキーなのかユニークなインデックスなのかは判らない)。

削除で INTEG_365 の値 1 の行を削除して追加で INTEG_365 の値 1 の行を追加していると考えました。
トランザクション中にこのようなことを行うとどうなるのでしょうか?

> こんな感じで実行すると
> violation of PRIMARY or UNIQUE KEY constraint "INTEG_365" on table "T_TABEL"
> エラーになります。
もう少し丁寧に書けませんか? ソース中のどの行でこの例外が発生するのか示すのがそんなに手間なこととは思えません

また、データーベースをお使いでしたら、名前とバージョンとエディションとも書いてください。
それから、開発環境や実行環境は出来るだけ始めに書いてください。
引用返信 編集キー/
■76410 / inTopicNo.5)  Re[4]: 伝票更新登録
□投稿者/ IceT (3回)-(2015/07/08(Wed) 08:17:00)
No76407 (しま さん) に返信
> ■No76406 (IceT さん) に返信
>>■No76405 (WebSurfer さん) に返信
> >>■No76404 (IceT さん) に返信
> >>
> 
> ソース中のどの行でこの例外が発生するのか
// 削除
_cmd.CommandText = sDelSQL;
_cmd.ExecuteNonQuery();

// 登録
foreach( var sSQL in lstSQL)
{
  _cmd.CommandText = sSQL;
  _cmd.ExecuteNonQuery(); -----(1)
}
削除を実行後、Insert文を実行する(1)のところです。
foreachで設定されるSQL文を詳細にみていくと
主キーがNULLになっている文がひとつありました。
これが原因だと思います。
> 
> また、データーベースをお使いでしたら、名前とバージョンとエディションとも書いてください。
Firebird 2.1.5です。

いろいろご指摘ありがとうございます。
おかげで解決いたしました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -