表題の件、どなたかご教授願います。
初心者で申しわけありません。
環境
言語:VB.net
db:Oracle10g、SQLServe(MSDE)
やりたいことはと言いますと、
Oracle、MSDEと同様の構造のテーブルを持っています。
しかし。Oracleにしかデータはありません。
このデータをMSDEにコピーしたいのです。
(SQL文は使用せずにやりたいです -> レコード数が多い(5万件ほど)・カラム数が多い(200列ほど))
イメージ的には
Oracleより、データセットを取得。
このデータセットをMSDEへコピー
みたいなやり方をやっています。
しかし、MSDEへ更新がされません
(ビルダーにてSQLが作成されない)
下記にコードを表します。
申しわけありませんが、ご指摘の程、お願いします。
(他になにか良い手があればご教授願えたらと思います)
=====================================================================================
'Oracle接続
Public OraCn As New OracleClient.OracleConnection
Public OraCm As New OracleClient.OracleCommand
Public OraDa As New OracleClient.OracleDataAdapter
'SQLServer接続
Public SqlCn As New SqlClient.SqlConnection
Public SqlCm As New SqlClient.SqlCommand
Public SqlDa As New SqlClient.SqlDataAdapter
Public DtSet_ora As DataSet = New DataSet("mst_ora")
Public DtSet_sql As DataSet = New DataSet("mst_sql")
Public DtRow As DataRow
Public DtTbl As DataTable
-----------------------------------------------------------------------------------------
Private Sub btn_exec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_exec.Click
'Oracle部
'データベース接続設定
OraCn.ConnectionString = "Data Source=Oracle10g;user id=****;data source=orcl;password=****;"
'データベースオープン
OraCn.Open()
Dim strsql As String
strsql = "select * from table01"
OraDa = New OracleClient.OracleDataAdapter(strsql, OraCn)
OraDa.Fill(DtSet_ora, "table01_ora")
MsgBox("マスタ読込完了" & Chr(13) & " Count:" & DtSet_ora.Tables("table01_ora").Rows.Count & Chr(13) & Chr(13) & "適用を開始します", MsgBoxStyle.OKOnly + MsgBoxStyle.Information, "通知")
'SQL Server部
Dim cb As New SqlClient.SqlCommandBuilder(SqlDa)
'データベース接続設定
SqlCn.ConnectionString = "Data Source=(local)\msde;Persist Security Info=False;Trusted_Connection=true;Initial Catalog=MSDE;"
'データベースオープン
SqlCn.Open()
'現在のマスタを削除
strsql = "truncate table table01"
SqlCm = New SqlClient.SqlCommand(strsql, SqlCn)
SqlCm.ExecuteNonQuery()
strsql = "select * from table01"
SqlDa = New SqlClient.SqlDataAdapter(strsql, SqlCn)
SqlDa.Fill(DtSet_sql, "table01_sql")
DtTbl = DtSet_sql.Tables("table01_sql")
DtTbl.ImportRow(DtSet_ora.Tables("table01_ora").Rows(1))
↓
とりあえず1件だけ更新してみようと思ってやってみました
DtSet_sql.Tables(0).ImportRow(DtSet_ora.Tables("table01_ora").Rows(1))
SqlDa.Update(DtSet_sql)
'終了処理
'データベースクローズ(SQL Server)
SqlCn.Close()
'データベースクローズ(Oracle)
OraCn.Close()
MsgBox("終了しました。", MsgBoxStyle.OKOnly + MsgBoxStyle.Information, "完了通知")
> しかし、MSDEへ更新がされません
> (ビルダーにてSQLが作成されない)
ビルダーというのが、何のことかわからなかったのですが、さしあたり、
各行の RowState が Unchanged になっていないかを確認してみてください。
> (他になにか良い手があればご教授願えたらと思います)
MSDE 2000 には、データ変換サービス(DTS:Data Transformation Service)の
ランタイムが含まれていたはずです。
ウィザードツールまで付属しているかどうかは別としても。
少なくとも、特定バージョンの Access や SQL Server などに付属の
MSDE ならば、データ変換サービス(DTS)のウィザード機能を使用する事が
できるので、もし DTS ウィザードあるいは DTS ランタイムが使用可能で
あるならば、ADO.NET でのコーディング自体が不要になるかも知れません。
DTS のインポート/エクスポートは、速度面でも効率がよいですし、
一度、調査してみては如何でしょう。
>ビルダーというのが、何のことかわからなかったのですが
多分 SqlCommandBuilder のことでしょう。
で、その他の手法に関しては魔界の仮面弁士 さまにお任せ
するとして、[ADO.NET]のコードの解説のみしておきます。
質問と直接関係無いけど、無駄なインスタンスの生成は控えてください。
(理由:予期してないオブジェクトが存在すると、処理対象と思ってる
オブジェクトをプログラマが間違う可能性が高くなります。)
'Oracle接続
Public OraCn As New OracleClient.OracleConnection
Public OraDa As OracleClient.OracleDataAdapter
'SQLServer接続
Public SqlCn As New SqlClient.SqlConnection
Public SqlCm As SqlClient.SqlCommand
Public SqlDa As SqlClient.SqlDataAdapter
でいいと思います。
[コマンドの自動生成]
http://msdn2.microsoft.com/ja-jp/library/tf579hcz.aspx
> コマンドを自動的に生成するための最低限の条件として、
> SelectCommand プロパティを設定する必要があります。
順番を間違っていますよね?
> Dim cb As New SqlClient.SqlCommandBuilder(SqlDa)
Select 文を設定する前に作成しようとしてます。
できるわけがありませんよね?。
早速の返信ありがとうございます。
>魔界の仮面弁士 様
DTS のインポート/エクスポートなるものがるのですね、
勉強不足ですみません。調査してみます。
>特攻隊長まるるう 様
>多分 SqlCommandBuilder のことでしょう。
すみません、言葉足らずでした。
まさにそのとおりです。
いろいろ調査してみましたが、うまくいきません。
おっしゃられているとおり、
RowState が Unchanged となっておりました。
addにする方法がわからないのもさることながら
もしかしたら、互いのDB構造に問題があるのかもしれません。
もっと調査&勉強してみます。
また何かありましたらご教授お願い致します。
ありがとうございました。
ツイート | ![]() |