データセットから、データベースへの更新について

解決


なかじ  2006-08-16 10:59:39  No: 96294

表題の件、どなたかご教授願います。
初心者で申しわけありません。

環境
言語: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, "完了通知")


魔界の仮面弁士  2006-08-16 19:57:49  No: 96295

> しかし、MSDEへ更新がされません
> (ビルダーにてSQLが作成されない)

ビルダーというのが、何のことかわからなかったのですが、さしあたり、
各行の RowState が Unchanged になっていないかを確認してみてください。

> (他になにか良い手があればご教授願えたらと思います)

MSDE 2000 には、データ変換サービス(DTS:Data Transformation Service)の
ランタイムが含まれていたはずです。
ウィザードツールまで付属しているかどうかは別としても。

少なくとも、特定バージョンの Access や SQL Server などに付属の
MSDE ならば、データ変換サービス(DTS)のウィザード機能を使用する事が
できるので、もし DTS ウィザードあるいは DTS ランタイムが使用可能で
あるならば、ADO.NET でのコーディング自体が不要になるかも知れません。

DTS のインポート/エクスポートは、速度面でも効率がよいですし、
一度、調査してみては如何でしょう。


特攻隊長まるるう  2006-08-16 20:08:59  No: 96296

>ビルダーというのが、何のことかわからなかったのですが
多分 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 文を設定する前に作成しようとしてます。
できるわけがありませんよね?。


なかじ  2006-08-18 04:37:04  No: 96297

早速の返信ありがとうございます。

>魔界の仮面弁士  様
DTS のインポート/エクスポートなるものがるのですね、
勉強不足ですみません。調査してみます。

>特攻隊長まるるう 様
  >多分 SqlCommandBuilder のことでしょう。
すみません、言葉足らずでした。
まさにそのとおりです。

いろいろ調査してみましたが、うまくいきません。
おっしゃられているとおり、
 RowState が Unchanged となっておりました。
addにする方法がわからないのもさることながら
もしかしたら、互いのDB構造に問題があるのかもしれません。
もっと調査&勉強してみます。

また何かありましたらご教授お願い致します。
ありがとうございました。


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

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






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