DataAdapterで削除、追加(一部編集の上で・・)の実行について

解決


タダ  2008-10-15 00:22:56  No: 145287

VB.NET2003, WindowsXP使用です。

ACCESS内のテーブルAのデータを全部Deleteし、
その後別のテーブルBのSELECTした値のうち、
あるフィールドについて「-」や「 」(スペース)を削除したものを、
テーブルAにINSERTしたいです。

下記のようにして、該当テーブルのデータ削除、追加が出来たのですが、
このINSERTの際の、商品マスタの部品番号から「-」や「 」(スペース)を削除しする場合、
どのようにして値を取得、編集とすればよいのでしょうか。

  cn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strMDBPath
  cn1.Open()
  Adapt1 = New OleDb.OleDbDataAdapter("DELETE FROM work商品マスタ", cn1)
  Adapt1.Fill(ds, "work商品マスタ")
  Adapt2 = New OleDb.OleDbDataAdapter("INSERT INTO work商品マスタ SELECT 商品マスタ.部品番号 AS NT品番, 商品マスタ.住友コード FROM 商品マスタ", cn1)
  Adapt2.Fill(ds, "work商品マスタ")

(strMDBPath:MS-ACCESSまでの絶対パス)

上記の後続くコードは下記のようになる?と考えていますが、
dtがnothingとなってしまい、値が取れません。

dt = ds.Tables("work商品マスタ")
For i as integer = 0 to dt.Rows.Count -1
 Dim strField As String = CStr(dt.Rows(j)("NT品番")).Replace("-", "")
 dt.Rows(j)("NT品番") = strField.Replace(" ", "")
Next
Adapt2.Update(ds, "work商品マスタ")

上記、adapt1、adapt2と分けているのも、ACCESS上でDELETEとINSERTができていたので、
とりあえずヨシと見ていますが、これが正しいかどうかも分かっていませんが、
取得したデータをどのように編集して、元のDBを更新すればいいか教えて頂けますか。


YuO  2008-10-15 00:53:02  No: 145288

根本的に,Fillの使い方が間違っているような気がします。
.NET Fraemork 1.1のヘルプがないようなので,.NET Framework 2.0のヘルプへのリンクになりますが,
http://msdn.microsoft.com/ja-jp/library/by7t044k(VS.80).aspx
OleDbDataAdapterのコンストラクタの第一引数は「selectCommand」,つまりSELECT文を書きます。
単純にDELETEやINSERTするだけなら,OleDbCommand.ExecuteNonQueryを使います。

-や を削除するだけなら,Replace関数を使って,
INSERT INTO work商品マスタ SELECT Replace(商品マスタ.部品番号, '-', ''), 商品マスタ.住友コード FROM 商品マスタ
みたいなSQLをExecuteNonQueryで発行するだけだと思いますが……。

もっと複雑な場合で,DataTableを経由するなら,INSERT終了後にSELECT文を渡したDataAdapterを作成してFillし,
データの変更をした後Updateすることになります。


タダ  2008-10-15 01:36:52  No: 145289

教えて頂いたURLを参照しました。

Adapt1 = New OleDb.OleDbDataAdapter("SELECT 商品マスタ.部品番号 AS NT品番, 商品マスタ.住友コード FROM 商品マスタ", cn1)
Adapt2.Fill(ds, "商品マスタ")

これで商品マスタのデータの取得は出来ましたが、
この取得したデータを、work商品マスタに対してINSERTする場合、

Adapt1.InsertCommand = New OleDBCommand("")

上記""には、どのように記述すればいいでしょうか。
また、まずwork商品マスタの中身をDELETEしてからINSERTを実行したいのですが、
DeleteCommandやInsertCommandの実行順の指定はどうすればよいでしょうか。

なお、Replace関数をSQL文に入れて実行したところ、
「未定義関数Replaceがあります」というエラーが出てしまうため、
取得した値を編集する必要があると考えています。


タダ  2008-10-15 03:53:18  No: 145290

Fillの使い方、間違えたままではありますが、
下記のようにして、目的のテーブルを得ることは出来ました。

                cn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strMDBPath
                cn1.Open()
                cmd1 = cn1.CreateCommand()
                cmd1.Connection = cn1
                oTrans1 = cn1.BeginTransaction
                cmd1.Transaction = oTrans1

                Adapt1 = New OleDb.OleDbDataAdapter("DELETE FROM work商品マスタ", cn1)
                Adapt1.SelectCommand.Transaction = oTrans1
                Adapt1.Fill(ds, "work商品マスタ")

                Adapt2 = New OleDb.OleDbDataAdapter("INSERT INTO work商品マスタ SELECT 商品マスタ.部品番号 AS NT品番, 商品マスタ.住友コード FROM 商品マスタ WHERE (((商品マスタ.仕入先コード)=1) AND ((商品マスタ.NTコード)<>0))", cn1)
                Adapt2.SelectCommand.Transaction = oTrans1
                Adapt2.Fill(ds, "work商品マスタ")

                Adapt3 = New OleDb.OleDbDataAdapter("SELECT * FROM work商品マスタ", cn1)
                Adapt3.SelectCommand.Transaction = oTrans1
                Adapt3.Fill(ds, "work商品マスタ")

                oleCom = New OleDb.OleDbCommandBuilder(Adapt3)
                dt = ds.Tables("work商品マスタ")
                For j As Integer = 0 To dt.Rows.Count - 1
                    strField = CStr(dt.Rows(j)("NT品番")).Replace("-", "")
                    dt.Rows(j)("NT品番") = strField.Replace(" ", "")
                Next
                Adapt3.Update(ds, "work商品マスタ")
                Adapt1.Dispose()
                Adapt2.Dispose()
                Adapt3.Dispose()

一つのDataAdapterだけ(「InsertCommand」「DeleteCommand」の使用?)で、
コードを書く方法が分からず・・です。


タダ  2008-10-15 03:54:05  No: 145291

最後に、

      oTrans1.Commit()

が抜けてました。


タダ  2008-10-15 16:00:26  No: 145292

不器用なコードのままですが、ひとまず解決とします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加