- PR -

複数外部MDBを1つにする方法

投稿者投稿内容
未記入
会議室デビュー日: 2006/07/10
投稿数: 5
投稿日時: 2006-07-10 19:19
環境[VB.NET 2002 + DB:ACCESS 2003 + odbc]
お世話になります。
複数外部MDBを1つにする方法を探しています。
パスワード設定されていないMDBファイルは参照元記事URLより実装できるのですが
パスワード設定しているMDBファイルの設定がうまくいきません。

Dim stCmd As OdbcCommand
Dim strSql As String
Dim inCmdResults As Integer
strSQL = "INSERT INTO a SELECT * FROM a in 'c:\\\\c.mdb'" ⇒OK
stCmd.CommandText = strSql
inCmdResults = stCmd.ExecuteNonQuery()

パスワード設定時のstrSQLの記述方法がわかりません。
"INSERT INTO a SELECT * FROM a in 'c:\\\\c.mdb;pwd=aaa'"
⇒エラー ファイル 'c:\\\\c.mdb;pwd=aaa' が見つかりませんでした。

色々な記述方法を試しましたがわかりませんでした。
どなたか御存知の方、ご教授宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 19:40
引用:

未記入さんの書き込み (2006-07-10 19:19) より:

パスワード設定時のstrSQLの記述方法がわかりません。
"INSERT INTO a SELECT * FROM a in 'c:\\c.mdb;pwd=aaa'"
⇒エラー ファイル 'c:\\c.mdb;pwd=aaa' が見つかりませんでした。


パスワードは、SQL コマンドに指定するのではなく、接続文字列 (ConnectionString) に指定するものです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-07-10 20:26
引用:

未記入さんの書き込み (2006-07-10 19:19) より:
パスワード設定時のstrSQLの記述方法がわかりません。
"INSERT INTO a SELECT * FROM a in 'c:\\c.mdb;pwd=aaa'"
⇒エラー ファイル 'c:\\c.mdb;pwd=aaa' が見つかりませんでした。


http://www7.big.or.jp/~pinball/discus/access/93933.html
から引用すると
引用:

Dim strSQL As String
strSQL = "insert into [C:\test_out.mdb;pwd=test02].data_out select * from [C:\test_in.mdb;pwd=test01].data_in"
CurrentDb.Execute strSQL


は出来るみたいです。
DAO だからできるのかも?良く分かりません。Jet の仕様だったと思うので、DAO か ODBC なのかには依存しなかったような気もするのですが。
自分でも昔、試しにやってみて ODBC ドライバーからでも出来たような気もしますが、覚えていません。
ただ、あまり強い意見ではないのですが、もしこれができるにしても、あまりやらないほうが良いと思います。普通にソースとデスティネーションのレコードセットをオープンして、ソースからデスティネーションへレコード単位でコピーしたほうが確実のように思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-07-10 20:28
こんばんは。ueです。

Jet エンジンの機能を使ってこういう書き方ができます。
コード:
Dim strSQL As String
strSQL = "INSERT INTO a SELECT * FROM a IN '' [MS Access; DATABASE=C:\\c.mdb;PWD=aaa;];"
CurrentDb.Execute strSQL


なんというか、ややこしい書き方なのでお薦めの方法じゃないです。
じゃんぬさんのご意見のとおり、接続文字列を使う方法をおすすめします。
接続文字列を使う方法に慣れておくと後々が楽です。

私は外部の mdb と連携するときには 外部 Jet データベースとの接続方法 というコンテンツのお世話になっています。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 20:37
引用:

未記入さんの書き込み (2006-07-10 19:19) より:

環境[VB.NET 2002 + DB:ACCESS 2003 + odbc]


うーん、ODBC ですか...
せっかくだから、以下のように OleDb を選びたいところです。

コード:

    Private Shared Sub せっかくだから、俺はこの赤の扉を選ぶぜ()
        Dim stConnectionString As String = ( _
            "Provider = Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source = C:\MakiUehara.mdb;"    & _
            "Jet OLEDB:Database Password = MakiMakiLove;" _
        )

        Dim oConnection As System.Data.OleDb.OleDbConnection

        Try
            oConnection = New System.Data.OleDb.OleDbConnection(stConnectionString)
            Dim oCommand As System.Data.OleDb.OleDbCommand

            Try
                oCommand = New System.Data.OleDb.OleDbCommand("SELECT * FROM MosaMosaAA", oConnection)
                oConnection.Open()
                oCommand.ExecuteNonQuery()
                oConnection.Close()
            Catch ex As Exception
                MessageBox.Show(ex.ToString(), "ダニー、グレッグ、生きてるか?")
                Throw
            Finally
                If Not oCommand Is Nothing
                    oCommand.Dispose()
                End If
            End Try      
        Finally
            If Not oConnection Is Nothing Then
                oConnection.Dispose()
            End If
        End Try
    End Sub


OleDb では、ダメでしょうか? (;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-07-10 20:48
ueです。
引用:

じゃんぬねっとさんの書き込み (2006-07-10 20:37) より:
うーん、ODBC ですか...
せっかくだから、以下のように OleDb を選びたいところです。


あ、未記入さんは ODBC を指定されてたんですね。
DAO のコードを書いてしまいました。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
未記入
会議室デビュー日: 2006/07/10
投稿数: 5
投稿日時: 2006-07-11 09:28
おはようございます。
じゃんぬねっと様、ue様回答ありがとうございます。
ODBC接続でその他のソース記述がある為、unibonさんの記述方法で試しました。

Dim strSQL As String
strSQL = "insert into [C:\\\\b.mdb;pwd=aaa].a select * from [C:\\\\c.mdb;pwd=aaa].a"
stCmd.CommandText = strSql
inCmdResults = stCmd.ExecuteNonQuery()
で上手くいきました。unibon様ありがとうございました。
本当にお世話になりました。助かりました!! m(__)m
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-11 10:28
引用:

未記入さんの書き込み (2006-07-11 09:28) より:

じゃんぬねっと様、ue様回答ありがとうございます。
ODBC接続でその他のソース記述がある為、unibonさんの記述方法で試しました。


うーん、ConnectionString で指定した方が素直だと思いますけどね。
(SQL コマンドを投げるまで、正当に実行できるのか評価できませんし)

OleDb でソースを書いたのは、直接的な回答をしたくなかったからですが、
今後閲覧される第三者のためにサンプル ソースを書いておきます。

コード:

    Private Shared Sub 遭えてODBCを選ぶぜ()
        Dim stConnectionString As String = ( _
            "Driver = {Microsoft Access Driver (*.mdb)};" & _
            "DBQ = C:\Hoge.mdb;" & _
            "PWD = MakiMakiLove;" _
        )

        Dim oConnection As System.Data.Odbc.OdbcConnection

        Try
            oConnection = New System.Data.Odbc.OdbcConnection(stConnectionString)
            Dim oCommand As System.Data.Odbc.OdbcCommand

            Try
                oCommand = New System.Data.Odbc.OdbcCommand("SELECT * FROM MosaMosaAA", oConnection)
                oConnection.Open()
                oCommand.ExecuteNonQuery()
                oConnection.Close()
            Catch ex As Exception
                MessageBox.Show(ex.ToString(), "ボスケテ")
                Throw
            Finally
                If Not oCommand Is Nothing
                    oCommand.Dispose()
                End If
            End Try      
        Finally
            If Not oConnection Is Nothing Then
                oConnection.Dispose()
            End If
        End Try
    End Sub


ConnectionString と、使用クラス名が若干変わっているくらいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)