none
ADO.NETでINSERT、一意制約に引っかかったらUPDATEしたい。 RRS feed

  • 質問

  • お世話になります。

     

    VisualStudio2005/.NET2.0でOleDbConnectionからデータベースを問わないプログラムを作っています。

    実行時に接続文字列とテーブル名、CSVファイルが渡され、CSVの内容をテーブルに追記するものです。

     

    DataSet.Fillで元テーブルを読み込み、そのDataTableに対してCSVからDataRowを作ってAddします(INSERT)。

    で、最後にUpdateするのですが、テーブルの列に一意制約がある場合、それにひっかかると当然例外が発生します。

    一意制約はテーブルによってあったりなかったり、複数列で設定されていることもあります。

     

    一意制約にひっかかる行には、CSVからの新しいデータを上書き(UPDATE)するのが要件です。

    DataTable.Addの時点で検知できて、そこで追加ではなく上書きする、とできれば理想かなぁと思っているのですが。。

    2008年5月1日 0:29

回答

  • 以下を参考にしてスキーマ情報が取得できますので、CSVからデータテーブルへ追加時に、新規か更新かを判断すればいいんじゃないでしょうか?

     

    既存mdbのテーブル情報の取得
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1463566&SiteID=7

     

    2008年5月1日 2:41
    モデレータ
  •  

    情報ありがとうございました。

     

    いろいろ試していて、以下の手順で解決できました。

    1.OleDbDataAdapter.FillSchemaにてテーブル情報を取得。

    2.OleDbDataAdapter.Fillにてレコードを読み込み。

    3.DataTable.PrimaryKeyで主キーを構成する列の配列を取得。

    4.ここでCSVからDataRowを作成。

    5.DataRowCollection.Findで既にこの主キーを持つレコードが存在するか判断。

    これで存在しなければINSERT、存在したらUPDATE。

    2008年5月1日 4:41

すべての返信

  • 以下を参考にしてスキーマ情報が取得できますので、CSVからデータテーブルへ追加時に、新規か更新かを判断すればいいんじゃないでしょうか?

     

    既存mdbのテーブル情報の取得
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1463566&SiteID=7

     

    2008年5月1日 2:41
    モデレータ
  •  

    情報ありがとうございました。

     

    いろいろ試していて、以下の手順で解決できました。

    1.OleDbDataAdapter.FillSchemaにてテーブル情報を取得。

    2.OleDbDataAdapter.Fillにてレコードを読み込み。

    3.DataTable.PrimaryKeyで主キーを構成する列の配列を取得。

    4.ここでCSVからDataRowを作成。

    5.DataRowCollection.Findで既にこの主キーを持つレコードが存在するか判断。

    これで存在しなければINSERT、存在したらUPDATE。

    2008年5月1日 4:41