いつもお世話になっております。
[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することをプログラムで制御できるのかどうかご存知の方がいらっしゃいましたらアドバイスいただけないでしょうか?
よろしくお願い致します。
私も引き続き調べます。
>SQLサーバーからAccessに対してexportすることをプログラムで制御できるのかど>うかご存知の方がいらっしゃいましたらアドバイスいただけないでしょうか?
SQL文の中に INSERT INTO OPENROWSET を定義すればSQLサーバーからダイレクトにACCESSのテーブルにデータ書き込めます。使い方はOPENROWSET で調べればかなり見つかると思います。注意点はネットワークで使う場合ACCESSの入っているフォルダーは共有しないといけなくなります。
はじめまして
同じ処理で困っているためお役に立てるかどうかわかりませんが
>これはユーザー定義型なので
DTSを使えるように参照設定が必要なのではないでしょうか?
http://support.microsoft.com/default.aspx?scid=kb;ja;323685
こちらはSqlServerが7.0のため
>DTSのVBのソース
の見方がわかりません。(7.0だとできないのかな?)
DTSを使わない方法ってあるんですかねぇ?
hirotaka様、レスありがとうございます。
現在OPENROWSETの使い方についてhelpやネットで調べております。
VBのソースからDTSパッケージに対してクエリを投げてmdbファイルをつくり、
そのmdbファイル内にテーブルをつくりデータをコピーする
ということができるんだなぁということは解りました。
あとはどういったSQLを投げればその動きをしてくれるのかを理解できればといったとこです。
たくまま様、同じ処理で困っていますね。というか、たくまま様が先にスレッドを立てていたのにそれを見ずに立ててしまい申し訳ないです。
SQLサーバー7.0だと出来るのかどうかわかりませんが、2000の場合EnterPrise Managerでマウス操作をしてDTSを使うと最後にVBにソースを吐き出すように選択できる個所がありますよ。
お世話になっております。自分でも調べつつテストしている結果なのですが、
とりあえず現状は
VBソース内でDAOを使用しCreateDatabaseでローカルPC内にtest.mdbというファイルを作るようにしました。(テーブルは一つも作っていません)
このtest.mdbファイル内にサーバー上にあるSQLサーバーのtestという名前の
DB内のテーブルとそのデータを全てコピーしたいのですが、やはりDTSを使用
しないと駄目なのでしょうか?
その場合DSNというファイルをあらかじめつくらなければいけないと思うのですが・・・
その場合やはり一つずつテーブルを作成するという記述がソース内には必要でしょうか?
もしくはhirotaka様が仰っていたOPENROWSETを使って直接SQLサーバーのテーブルをmdbにコピーするという方法になるのでしょうか?
ご存知の方いらっしゃいましたらアドバイスをいただければと思います。
よろしくお願い致します。(もちろん自分でも調査続行です)
はじめまして。
SQLサーバーのテーブル取得
http://homepage2.nifty.com/inform/vbdb/ado_sqlservertables.htm
DAOでSQLサーバーからmdb内にエクスポート
http://homepage2.nifty.com/inform/vbdb/dao_sql2mdb.htm
SQLサーバーのテーブル名をループで取得して、DAOでエクスポートすれば出来ます。
的外れでしたらご容赦下さい。
えれも様、レスありがとうございます。
貼り付けていただいたリンクを見たところ、まさにやりたい事のサンプルが乗っておりました。
よく読んで試してみます。ありがとうございます。
うまくプログラムを組むことが出来たらちゃんと報告させていただきます。
お世話になっております。
もう一息というところまで来てるのですが、疑問点が出てきまして・・・
現状、サーバー上に置いてある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サーバのテーブル名を取得しているのですが、ひょっとしてこの書き方では根本的に間違っているのでしょうか?
もしご存知の方がいらっしゃいましたらアドバイスいただければと思います。
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
当方では同様の書き方で問題なく動作しております。
この前段階で何か問題があるのではないでしょうか?
えれも様、レスありがとうございます。
度々答えていただき本当にありがとうございます。おかげさまで一歩ずつですが前に進んでいます。
上記の貼り付けたソースですが、変数名 "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
こんな感じかな?
' 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
えれも様、レスありがとうございます。
ここの処理につまづき未だにうまく動かすことが出来ないでいました。
ここまで甘えてしまってえれも様他、レスを下さった方々にはご迷惑をおかけします。本当に助かります。
上記ソースですが、早速試してみます。今回DAOは無しでやらなければいけない為(ADO/ADOXだけ・・・の予定)そこで非常に苦労しています。
ありがとうございます。
違う掲示板で同じ質問されてるのですね。VB関係とSQL関係で。
あっちこっちに投稿するのは控えたほうがよろしいかと。
SQL関係でソースの提示もあったようですし・・・。
すみません。つい色々書いてしまいました。
これからは気をつけて書き込みいたします。
アドバイスありがとうございます。
皆様色々アドバイスありがとうございました。
SQLサーバや、ACCESSは初めて触ったのでえれも様からもご指摘があったように
マルチしてしまいました。
ですが、おかげさまで何とかこぎつけることが出来ました。ありがとうございました。
これからはちゃんとそういうルールにのっとって投稿いたします。よろしくお願いします
ツイート | ![]() |