SQLサーバーのDBをACCESSにコピーするには?

解決


VBがんばってます  2004-09-03 00:56:04  No: 85381

いつもお世話になっております。
[Win2000],[VB6],[SQLサーバー2000],[Access2000]にて開発を行っています。

SQLサーバーのDB内のテーブルをアクセスにコピーするということをEnterPrise Managereを使わずVBからのプログラムで制御したいと思っています。

現状EnterPrise Managereを使用して吐き出したDTSのVBのソースを見ているおり、実験的にそのソースを画面から起動して動くかどうか確かめています。

そこで問題があり、ソースの一番最初に
Public goPackageOld As New DTS.Package
Public goPackage As DTS.Package2
と宣言されているのですが、これはユーザー定義型なのでsub main()を呼ぶ前に
何らかの値を渡して上げなければいけないと思うのですが、正直この部分が何を行っているのがわかっていません。

もしご存知の方がいらっしゃいましたらアドバイスいただけないでしょうか?またSQLサーバーからAccessに対してexportすることをプログラムで制御できるのかどうかご存知の方がいらっしゃいましたらアドバイスいただけないでしょうか?
よろしくお願い致します。
私も引き続き調べます。


hirotaka  2004-09-03 01:36:01  No: 85382

>SQLサーバーからAccessに対してexportすることをプログラムで制御できるのかど>うかご存知の方がいらっしゃいましたらアドバイスいただけないでしょうか?

SQL文の中に  INSERT INTO OPENROWSET  を定義すればSQLサーバーからダイレクトにACCESSのテーブルにデータ書き込めます。使い方はOPENROWSET  で調べればかなり見つかると思います。注意点はネットワークで使う場合ACCESSの入っているフォルダーは共有しないといけなくなります。


たくまま  2004-09-03 19:35:27  No: 85383

はじめまして
同じ処理で困っているためお役に立てるかどうかわかりませんが

>これはユーザー定義型なので
DTSを使えるように参照設定が必要なのではないでしょうか?

http://support.microsoft.com/default.aspx?scid=kb;ja;323685

こちらはSqlServerが7.0のため
>DTSのVBのソース
の見方がわかりません。(7.0だとできないのかな?)

DTSを使わない方法ってあるんですかねぇ?


VBがんばってます  2004-09-03 19:46:00  No: 85384

hirotaka様、レスありがとうございます。
現在OPENROWSETの使い方についてhelpやネットで調べております。

VBのソースからDTSパッケージに対してクエリを投げてmdbファイルをつくり、
そのmdbファイル内にテーブルをつくりデータをコピーする

ということができるんだなぁということは解りました。
あとはどういったSQLを投げればその動きをしてくれるのかを理解できればといったとこです。

たくまま様、同じ処理で困っていますね。というか、たくまま様が先にスレッドを立てていたのにそれを見ずに立ててしまい申し訳ないです。

SQLサーバー7.0だと出来るのかどうかわかりませんが、2000の場合EnterPrise Managerでマウス操作をしてDTSを使うと最後にVBにソースを吐き出すように選択できる個所がありますよ。


VBがんばってます  2004-09-04 01:25:22  No: 85385

お世話になっております。自分でも調べつつテストしている結果なのですが、
とりあえず現状は

VBソース内でDAOを使用しCreateDatabaseでローカルPC内にtest.mdbというファイルを作るようにしました。(テーブルは一つも作っていません)
このtest.mdbファイル内にサーバー上にあるSQLサーバーのtestという名前の
DB内のテーブルとそのデータを全てコピーしたいのですが、やはりDTSを使用
しないと駄目なのでしょうか?
その場合DSNというファイルをあらかじめつくらなければいけないと思うのですが・・・

その場合やはり一つずつテーブルを作成するという記述がソース内には必要でしょうか?

もしくはhirotaka様が仰っていたOPENROWSETを使って直接SQLサーバーのテーブルをmdbにコピーするという方法になるのでしょうか?

ご存知の方いらっしゃいましたらアドバイスをいただければと思います。
よろしくお願い致します。(もちろん自分でも調査続行です)


えれも  2004-09-04 08:14:20  No: 85386

はじめまして。

SQLサーバーのテーブル取得
http://homepage2.nifty.com/inform/vbdb/ado_sqlservertables.htm

DAOでSQLサーバーからmdb内にエクスポート
http://homepage2.nifty.com/inform/vbdb/dao_sql2mdb.htm

SQLサーバーのテーブル名をループで取得して、DAOでエクスポートすれば出来ます。
的外れでしたらご容赦下さい。


VBがんばってます  2004-09-06 18:13:23  No: 85387

えれも様、レスありがとうございます。

貼り付けていただいたリンクを見たところ、まさにやりたい事のサンプルが乗っておりました。
よく読んで試してみます。ありがとうございます。

うまくプログラムを組むことが出来たらちゃんと報告させていただきます。


VBがんばってます。  2004-09-07 02:59:20  No: 85388

お世話になっております。
もう一息というところまで来てるのですが、疑問点が出てきまして・・・

現状、サーバー上に置いてあるSQLサーバのテーブル名を取得することは出来ました。(ループ変数でまわしております)

そしてテーブル名が一つ取れるごとにSelect Into構文を用いてmdbファイルにデータをコピーするという記述をしているのですが、【オブジェクト変数、またはwithブロック構文が閉じられていません】というエラーを吐き出します。

以下、ソースなのですが、
For Each tbl In ctlog2.Tables       'DBのテーブルコレクション内をループ
    If tbl.Type = "TABLE" Then      '通常のテーブルの場合だけ        
        strSQL = "select * into " & tbl.Name & _
             " IN 'C:\test.mdb' from " & tbl.Name
        db.Execute strSQL    
    End If
Next

tbl.nameにはループが回るたびにSQLサーバのテーブル名を取得しているのですが、ひょっとしてこの書き方では根本的に間違っているのでしょうか?
もしご存知の方がいらっしゃいましたらアドバイスいただければと思います。


えれも  2004-09-07 06:20:42  No: 85389

For Each tbl In ctlog2.Tables       'DBのテーブルコレクション内をループ
    If tbl.Type = "TABLE" Then      '通常のテーブルの場合だけ        
        strSQL = "select * into " & tbl.Name & _
             " IN 'C:\test.mdb' from " & tbl.Name
        db.Execute strSQL    
    End If
Next

当方では同様の書き方で問題なく動作しております。
この前段階で何か問題があるのではないでしょうか?


VBがんばってます  2004-09-07 07:03:53  No: 85390

えれも様、レスありがとうございます。
度々答えていただき本当にありがとうございます。おかげさまで一歩ずつですが前に進んでいます。

上記の貼り付けたソースですが、変数名 "db"は
Dim db as DAO.databaseで宣言してます。

ここで気づいたのですが、サーバー上にあるSQLサーバにはADOで
接続していたのですが、それがまずかったのでしょうか?
ODBCで接続しないと上記の部分は落ちるのかなぁと思いました(これから試します。)

現在、それを回避すべく別の方法で試しております。
しかし【入力テーブルまたはクエリ'test'が見つかりません】とエラーがでます。
これはつまりmdbファイルの中にtestテーブルがないのでデータをコピーすることが出来ない、と言っているのでしょうか?

以下がソースなのですが、やっていることはこれで全部です。もしなにか引っかかる部分がありましたらアドバイスをいただけると本当に助かります。
教えて君で本当に申し訳ないです。

Dim ctlog As New ADOX.Catalog, strDB As String
Dim strConnect As String
Dim conn As New ADODB.Connection
Dim ctlog2 As New ADOX.Catalog
Dim tbl As ADOX.table, strSQL As String
Dim conn2 As New ADODB.Connection

strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

※ここでmdbファイル作成
strdb = "C:\test2.mdb"

conn.Open "Provider=SQLOLEDB;Data Source=XXX;" & _
       "Initial Catalog=XXX;User Id=X;Password=X;"

conn2.Open strConnect & strDB
ctlog2.ActiveConnection = conn      'テーブル一覧を取得する

For Each tbl In ctlog2.Tables       'DBのテーブルコレクション内をループ
    If tbl.Type = "TABLE" Then      '通常のテーブルの場合だけ
        strSQL = "select * into " & tbl.Name& " from " & tbl.Name
        conn2.Execute strSQL
    End If
Next


えれも  2004-09-08 04:31:47  No: 85391

こんな感じかな?

' SQL Server のテーブルを MDBファイル内にエクスポートする

Dim strConnect As String
Dim strSQL As String
Dim db As DAO.Database
Dim tbl As ADOX.Table
Dim cn As New ADODB.Connection
Dim cat As ADOX.Catalog

Set cat = New ADOX.Catalog
'空のDBを作成
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb;"

cn.Open "Provider=SQLOLEDB;Data Source=XXXX;" & _
             "Initial Catalog=XXXX;", "X", "X"

cat.ActiveConnection = cn
    
strConnect = "ODBC;Driver={SQL Server};Server=XXXX;" & _
                 "Database=XXXX;UID=X;PWD=X;"
    
'-- 接続文字列を使用して SQL Server に接続する
Set db = DBEngine.OpenDatabase("", False, False, strConnect)

'DBのテーブルコレクション内をループする
For Each tbl In cat.Tables
    
    If tbl.Type = "TABLE" Then ' 通常のテーブルの場合だけ
            
        strSQL = "select * into " & tbl.Name & _
             " IN '" & "C:\test.mdb" & "' from " & tbl.Name
            
        db.Execute strSQL ' クエリーの実行
            
    End If
        
Next

もっとスマートな書き方があるかもしれませんが、一応はこれで動きます。
試してみて下さい。

言い忘れましたが、SQLサーバー側で設定してあるテーブルの主キーは、mdb側では設定されません。
主キー、インデックスまで完璧にコピーする方法は分かりません。m(__)m


VBがんばってます  2004-09-08 04:37:58  No: 85392

えれも様、レスありがとうございます。
ここの処理につまづき未だにうまく動かすことが出来ないでいました。

ここまで甘えてしまってえれも様他、レスを下さった方々にはご迷惑をおかけします。本当に助かります。

上記ソースですが、早速試してみます。今回DAOは無しでやらなければいけない為(ADO/ADOXだけ・・・の予定)そこで非常に苦労しています。

ありがとうございます。


えれも  2004-09-08 05:57:49  No: 85393

違う掲示板で同じ質問されてるのですね。VB関係とSQL関係で。
あっちこっちに投稿するのは控えたほうがよろしいかと。
SQL関係でソースの提示もあったようですし・・・。


VBがんばってます  2004-09-08 06:18:04  No: 85394

すみません。つい色々書いてしまいました。
これからは気をつけて書き込みいたします。

アドバイスありがとうございます。


VBがんばってます  2004-09-08 18:35:16  No: 85395

皆様色々アドバイスありがとうございました。

SQLサーバや、ACCESSは初めて触ったのでえれも様からもご指摘があったように
マルチしてしまいました。

ですが、おかげさまで何とかこぎつけることが出来ました。ありがとうございました。
これからはちゃんとそういうルールにのっとって投稿いたします。よろしくお願いします


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

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






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