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を更新すればいいか教えて頂けますか。
根本的に,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することになります。
教えて頂いた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があります」というエラーが出てしまうため、
取得した値を編集する必要があると考えています。
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」の使用?)で、
コードを書く方法が分からず・・です。
最後に、
oTrans1.Commit()
が抜けてました。
不器用なコードのままですが、ひとまず解決とします。
ツイート | ![]() |