• ベストアンサー

SQLServerからMDBへのデータバックアップ

SQLServer7.0からクライアントPCへMDB形式でデータバックアップを取ろうと考えており VBAを使って以下のPGを作成したのですがSQLServerのテーブルが参照できないらしく テーブルが見つかりませんとエラーが出てしまいます。 SQLServerのテーブル指定部分がいけないのは分かっているのですがどう記述すれば分かりません。 本来このようなレベルでは自分で調べなければいけないことは重々承知なのですが、 うちの会社には書籍がほとんど無いのです・・・。 下記の方法はネットで調べました。 DoCmd.CopyObject以外でももっ効率よくテーブルごと転送する方法はあるのでしょうか? お恥ずかしい話ですが、識者の方 ご教授よろしくお願い致します。 Dim db As DAO.database Dim DBname As String Dim DB_SQL As String DBname = "c:\temp\ZZZ.mdb" If Dir(DBname) <> "" Then Kill DBname End If Set db = CreateDatabase(DBname, dbLangJapanese) db.Close Set db = Nothing DB_SQL = "DRIVER={SQL Server};SERVER=XXX;DATABASE=XXX;UID=XXX;PWD=XXX" DoCmd.CopyObject DBname, , acTable, DB_SQL & ".テーブル名" Exit Sub

  • Y_Y
  • お礼率96% (137/142)

質問者が選んだベストアンサー

  • ベストアンサー
  • akiaki2
  • ベストアンサー率59% (16/27)
回答No.2

僕も似たようなことやってますが、バックアップを取るMDBにフォームを作って、次のような感じでやってます。 dim sSQL as String dim Rs as ADODB.Recordset 'バックアップを取るテーブル名の一覧を取ります sSQL = "select name from sysobjects where xtype='U' order by name" Set Rs = New ADODB.Recordset Rs.Open sSQL, [コネクション], adOpenForwardOnly,adLockReadOnly, adCmdText Do Until Rs.EOF  ' MDBのテーブルのドロップとSQLServerからのインポート  DeleteTable Rs("name")  DoCmd.TransferDatabase acImport, "ODBC データベース", [接続文字列], acTable, Rs("name"), Rs("name")  Rs.MoveNext Loop Rs.Close Set Rs = Nothing で、MDBを閉じる時に自動的に最適化するように設定してます。 コード部分は抜粋ですみませんが、ご参考になれば幸いです。

Y_Y
質問者

お礼

教えていただきましたソースを参考にして 無事に目的のPGを作ることが出来ました。 大変感謝しております。 ありがとう御座いました。

その他の回答 (1)

回答No.1

こちらを参考にしてみてください。 私は DoCmd.TransferDatabase が良さそうな気がします。 そのまま使っただけでは SQL-Server → 他のMDB にデータの転送はできませんけど。

参考URL:
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGnrlHowToAttachExternalMdb.html
Y_Y
質問者

お礼

参考URLを見まして、他にも色々と勉強できました。 ご回答ありがとう御座います。

関連するQ&A

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • SQLServer 列の「説明」の取得について

    SQLDMOオブジェクトを用いて、テーブルの列挙、列の列挙までは行なえるようですが、列の「説明」の項目の取得は行なえないのでしょうか? SQLDMOでなくても、何か取得出来る方法があればご教授お願いします。 --サンプル Public Function Main() Dim objServer As SQLDMO.SQLServer Dim objDatabase As SQLDMO.Database Dim objTables As SQLDMO.Tables Dim curTable As SQLDMO.Table Dim curCOl As SQLDMO.Column Const DB_NAME As String = "local" Const DB_USER As String = "sa" Const DB_PASSWD As String = "password" Const DB_USE As String = "hoge" ' オブジェクト作成 Set objServer = CreateObject("SQLDMO.SQLServer") ' 接続 Call objServer.Connect(DB_NAME, DB_USER, DB_PASSWD) 'DB選択 Set objDatabase = objServer.Databases(DB_USE) 'テーブル一覧 Set objTables = objDatabase.Tables ' テーブルの列挙 For Each curTable In objTables If curTable.SystemObject Then Debug.Print curTable.Name & " [system]" Else Debug.Print curTable.Name '列名の列挙 For Each curCOl In curTable.Columns Debug.Print curCOl.Name '*!ここで列の説明は取得出来ないのでしょうか??? Next End If Next ' 切断 Call objServer.Disconnect End Function

  • アクセスVBAです

    Sub test() Dim DB As Database Dim T As TableDef Dim myTable As String myTable = "Table1" Set DB = OpenDatabase(CurrentProject.FullName) For Each T In DB.TableDefs If T.Name = myTable Then DoCmd.DeleteObject acTable, myTable Exit For End If Next DB.Close Set DB = Nothing End Sub これを実行しようとすると Dim DB As Database の部分で コンパイルエラー プロジェクトではなく、ユーザ定義型を指定してください。 と言うエラーになります。 Dim DB As Objectにすればエラーにならずに進みますが 何が原因なのでしょうか?

  • エラー3011

    パス名もきちんと設定し、データもあっているのですが オブジェクトが存在しないか、名前、パス名が違うと エラーがでてしまいます。どこが違うのでしょうか? Dim db As String Dim db_Mdb As DAO.Database Dim rd_Mdb As DAO.Recordset Dim stSQL As String db = "C:\XXX\VB\kanri.mdb"   'パス名は、アドレスをコピー貼り付けしたので間違いないと思います) ”省略(データベースに接続)” stSQL = "select * from name where bango=0001;" Set rd_Mdb = db_Mdb.OpenRecordset(stSQL, dbOpenTable) お願いしますm(__)m

  • 別のMDBのフォームを開く操作をしているのですがエラーになってしまいま

    別のMDBのフォームを開く操作をしているのですがエラーになってしまいます (Access2003 SP3を使用) Function keisan() Dim obj As Access.Application Dim db_name As String Dim tmpDB As Database Dim tabname As String Dim tdynaset as Recordset Dim KeisanKekka as Boolean ’MDBのフォームを開く db_name="c:\keisan.mde" Set obj = GetObject(db_name) obj.DoCmd.OpenForm "計算", acNormal, , , , acDialog obj.Application.Quit Set obj = Nothing '計算結果をもってくる Set tmpDB = OpenDatabase(db_name)'ここでエラー**** Set tdynaset = tmpDB.OpenRecordset("select 計算結果 from データ", dbOpenSnapshot, dbForwardOnly) KeisanKekka = Nz(tdynaset.Fields(0), False) tdynaset.Close Set tdynaset = Nothing tmpDB.Close Set tmpDB = Nothing End Function これで1回目は上手くできるのですが2回目からOpenDatabaseのところでエラーになってしまいます 「実行時エラー3045 c:\keisan.mdbは既に使用されているので、使用できませんでした」 GetObjectの解放はしているのになぜこのようなエラーがでてしまうのでしょうか・・・ 別のPCでもやってみたのですが同じエラーが起こりました どうかよろしくお願いします

  • SQLServerに接続できない

    SQLServerを別PCにて稼動させて、クライアントPCよりVBAにて接続を試みているのですが、「SQLServerが存在しないか、アクセスが拒否されました。」と出て、接続が出来ません。 何が問題なのか分からず、困っています。 どなたかご教授頂けないでしょうか。 (ローカルで接続する分には、接続が出来る事を確認しています。) また、環境は以下のような形です。 ServerPC名:AAA SQLバージョン:SQLServer2005Express ServerOS:Win2003Server ログイン用アドレス:TAROU クライアントのVBAは以下のような記載をしています。 ------- Dim strSQL As String Dim rsTmp As ADODB.Recordset Dim DB As String DB = "Provider=MSDASQL;Driver={SQL Server};" & "Server=AAA\SQLEXPRESS;" & "Database=TEST;" & "" Set rsTmp = New ADODB.Recordset strSQL = "SELECT * From TEST_TABLE" rsDeli.Open strSQL, DB, adOpenStatic, adLockOptimistic -----------------

  • エクセルVBAでアクセスのテーブルを操作

    アクセスのテーブルを名前を変えて保存したいのですが、エラー「2486:アクションを実行出来ない。」のメッセージが発生してしまいます。 構文は、以下の通りです。 Sub test() Dim ACC As Object Dim ACCC As ADODB.Connection Dim ACCR As ADODB.Recordset Dim SQL As String Set ACC = Access.Application Set ACCC = New ADODB.Connection Set ACCR = New ADODB.Recordset Const ACCpath = "D:\DB.mdb" SQL = "SELECT * FROM [dammy]" '接続し開く ACCC.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ACCpath ACCR.Open SQL, ACCC, adOpenStatic, adLockOptimistic ACCR.MoveFirst If ACCR.Fields("日付").Value < DateSerial(Year(Now), 1, 1) Then ACC.DoCmd.CopyObject , "dammy(" & Year(Now) - 1 & "年)", acTable, "dammy" ACC.DoCmd.RunSQL "DELETE [dammy].* FROM [dammy];" End If End Sub エラー発生箇所は、IF文の中です。 対処方法を教えて下さい。 宜しくお願いします。

  • SQLServerデータをDataGridに表示時にエラーが発生

    SQLServerデータをDataGridに表示時にエラーが発生 visual Studio2008を使用し、SQLServerから条件を指定しそれをDataGridに一覧表示するvbを組んでいますが、エラーが解消しなく困っております。対応方法について教えてください。 【状況】 1 Dim St As String 2 Dim Cn As New System.Data.SqlClient.SqlConnection 3 Dim SQL As System.Data.SqlClient.SqlCommand 4 Dim ServerName As String = "Server名"  5 Dim UserID As String = "id" 6 Dim Password As String = "×××" 7 Dim DatabaseName As String = "Dbname" 8 Dim Adapter As New SqlClient.SqlDataAdapter(SQL, Cn) 9 Dim table As New DataTable 10 St = "Server=" & ServerName & ";" 11 St &= "User ID=" & UserID & ";" 12 St &= "Password=" & Password & ";" 13 St &= "Initial Catalog=" & DatabaseName 14 Cn.Open() 15 Cn.ConnectionString = St 16 SQL = Cn.CreateCommand 17 SQL.CommandText = ("SELECT * FROM CUSTOMER_M WHERE CUSTOMER_NAME LIKE " & "'%' & TextBoxName.Text & '%'") 18 Adapter.Fill(table) 19 DataGrid1.DataSource = table 20 Cn.Close() 21 SQL.Dispose() 22 Cn.Dispose() 8行目の「Adapter」がエラーになり、オーバーロードの解決に失敗しましたとメッセージが出ています。8行目の(SQl、Cn)を省くとコンパイルエラーはなくなりますが、14行目でエラーになります。 宜しくお願いします。

  • アクセス リンク先のバックアップテーブル削除

    お世話になっております。 以前、リンク先DBでリンクテーブルのバックアップをとり、 同じ名称のテーブルがあったら処理しない というVBAを教えていただいたのですが・・・ そこに付随して質問です。 Dim appAccess As Access.Application Set appAccess = CreateObject("Access.Application") With appAccess .OpenCurrentDatabase strLinkDB If numHantei = 1 Then .DoCmd.TransferDatabase acImport, "Microsoft Access", _ strLinkDB, acTable, "T_権限情報", "BK_テーブル1_" & Format(Date, "yymmdd") .DoCmd.TransferDatabase acImport, "Microsoft Access", _ strLinkDB, acTable, "T_社員情報", "BK_テーブル2_" & Format(Date, "yymmdd") End If .Quit End With Set appAccess = Nothing 7日以上経過したバックアップファイルを削除するには (DoCmd.DeleteObject acTableを使って削除になるかと思いますが)、 実際、どのようにしたら可能でしょうか。 初心者につき、ご教示いただけると幸いです。 よろしくお願い致します。

  • 他のMDBのテーブルに追加したい

    Access2010のADOについてご質問します。 以下のようにして、データを追加しています。 Dim SQL As String Dim cn As ADODB.Connection Set cn = CurrentProject.Connection ' SQL = "INSERT INTO テーブルA ( 勤務時間 ) " SQL = SQL & "SELECT [テーブルA ].[勤務時間] " SQL = SQL & "FROM テーブルA ; " cn.Execute SQL ご質問したいのは、 当MDB(PC)から社内サーバーにあるMDBのテーブルに追加したいのです。 違うテーブル名でしたら、リンクをすれば済む話とは思いますが 同じテーブル名の「テーブルA」なので どのようにすればいいのか困っています。 ご指導の程をよろしくお願いします。