FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

↑やる気アップにご協力をお願いします。わぁいヽ(∇⌒ヽ)(ノ⌒∇)ノわぁい♪

こんな記事もありますよ


別のデータベースとテーブルの構造を比較しちゃう?

今回の無駄コードは

他のデータベースと、現在利用しているデータベースのテーブル構造を
比較してみるコード…

名付けて…

テーブル構造が一緒かどうか、調べちゃいなよ

コードです。

…いいんですよ… ね~みんぐは気にしないでください… ┐('~`;)┌



基本的に自分が作るデータベースは、レコード保存用と操作用の2つを作ってます。

こうすると、保存用のデータベースを気にせずに操作用のバージョンアップが
簡単にできるので、お勧めです…って…常識なんでしょうね…orz

\(・_\) ソノハナシハ (/_・)/ コッチニオイトイテ

…ですが!!今回作成したデータベースは2つに分けずに
1つでつくることになってしまいました。

いえ…別にいいんですよ…やることに大きな違いはないんですから…
…と思ってたんですよ!!

でもそうなると、バージョンアップしたときに、旧ファイルから
データを引っ張ってこなければいけないわけですよ!

自分だけが使うのであれば、間違ったデータを引っ張ってくることは
ありませんが、他の人が必ずしもそうだとは限らないじゃないですか…。

そんな訳で、指定したデータベースのテーブル構造が同じかどうかを
ある程度調べて同じだったらコピーしちゃおう!って仕組みが
必要なわけです。

ま…そんな訳で、今回作成したコードはこちら!

指定したテーブル構造を簡単に調べて、同じだったら現在のデータベースに、
コピー元のデータベースの指定したテーブルをコピーしちゃってくれます。
この辺は、適当に処理を書いた感じです。(;^_^A アセアセ
Sub CompareTbl()

On Error GoTo errChk
Dim dbPass As String 'コピー元のファイルパス
Dim reply As Integer 'メッセージボックス返信用

Dim cnA As ADODB.Connection '現在のデータベース用
Dim cnB As New ADODB.Connection 'コピー元データベース用

Dim rsA As New ADODB.Recordset '現在のテーブル用
Dim rsB As New ADODB.Recordset 'コピー元のテーブル用

Dim strName(2) As String 'テーブル名の格納用変数 -> 今回は3つのテーブルを比較

Dim i As Integer 'テーブル名のループ用変数
Dim ii As Integer 'フィールド名のループ用変数

Dim strErr as String 'エラーメッセージ用

'コピーしたいテーブル名を指定する、今回は3つ指定
Dim strName(0) = "Tbl_A"
Dim strName(1) = "Tbl_B"
Dim strName(2) = "Tbl_C"

dbPass = "コピー元のデータベースのファイルパス"

strErr = "指定されたファイルは、テーブル構造が異なります。"

'指定されたパスが正しいかどうかの確認
If Dir(dbPass, vbNormal) = "" Then
  MsgBox "指定されたファイルは存在しません。処理を中断します"
  Exit Sub
End if

'現在のデータベースに接続
Set cnA = CurrentProject.Connection

'コピー元データベースに接続
cnB.ConnectionString = _
"provider = Microsoft.Jet.OLEDB.4.0; Data Source =" & dbPass

cnB.Open

'テーブルの比較
For i = 0 To UBound(strName) '-->strNameの( )内の最大数ループする (添え字の回数)
  rsA.Open strName(i), cnA, adOpenForwardOnly, adLockReadOnly
  rsB.Open strName(i), cnB, adOpenForwardOnly, adLockReadOnly

  'フィールド数が同じかどうかの確認
  If rsA.Fields.Count <> rsB.Fields.Count Then
    MsgBox strErr, vbOKOnly, "情報"
    GoTo Closing
  End If

  'フィールド名が同じかどうかの確認
  For ii = 0 To rsA.Fields.Count - 1
    If rsA.Fields(ii).Name <> rsB.Fileds(ii).Name Then
      MsgBox strErr, vbOKOnly, "情報"
      Goto Closing
    End If
  Next ii

  rsA.Close
  rsB.Close

Next i

Set rsA = Nothing
Set rsB = Nothing
'--------比較はここまで--------

'コピーをするかどうかの確認
reply = Msgbox("旧バージョンのデータを移行しますか?", vbYesNo, "情報")

If reply <> vbYes Then
  MsgBox "処理を中止しました", vbOKOnly, "情報"
  Goto Closing
End If

i = 0
'コピー処理の開始
For i = 0 To UBound(strName) '-->strNameの( )内の最大数ループする。(添え字の回数)
  DoCmd.DeleteObject acTable, strName(i)
  DoCmd.TransferDatabase acImport, "Microsoft Access", _
  dbPass, acTable, stName(i), stName(i)
Next i

cnA.Close: Set CnA = Nothing
cnB.Close: Set cnB = Nothing

Exit Sub

errChk:
Select Case Err.Number

Case -2147217900 '指定したテーブルが存在しない場合
  MsgBox strErr, vbOKOnly, "情報"

Case Else
  MsgBox "予期しないエラーが発生しました。処理を中断します。"

End Select

'レコードセットとデータベースのクローズ処理
Closing:
If rsA.State <> 0 Then rsA.Close
Set rsA = Nothing

If rsB.State <> 0 Then rsB.Close
Set rsB = Nothing

If cnA.State = adStateOpen Then cnA.Close
Set cnA = Nothing

If cnB.State = adStateOpen Then cnB.Close
Set cnB = Nothing

End Sub
む…無駄に長い…orz

確かに自分が何やってるかわかるようにコメントつけまくりましたが…
やっぱり非効率なのでしょうか…コードだけは無駄に長くなってます。(;^_^A

えっと…とりあえず、今回は3つのテーブルを比較していますが、
配列変数のstrName()の括弧内の数字を変更することで
いくつでも比較できるのではないでしょうか?

もし比較するテーブル数を変更した場合でも、
テーブル比較時のループ数と、コピー処理時のループの回数は
自動的に変更してくれます。。

あ!もちろん配列変数(strName(x))にそのテーブル名を指定してあげることも
忘れてはいけないです。

ま~比較といっても、ご覧の通り細かい比較はできてないですね…
フィールド数と名前が一致したらOK!っていうレベルです…。orz

57行目の
If rsA.Fields(ii).Name <> rsB.Fileds(ii).Name Then
の部分を
If rsA.Fields(ii).Type <> rsB.Fileds(ii).Type Then
と変更したり追加したりすることで、多分データ型なんかもチェックできると思いますけど…
割愛です。(^^ゞ

ちなみにファイルパスについてですが、
私は、AccessClubさんの「Windows APIを用いてファイルを開く方法」を利用しています。
必ず同じ場所にあるとは限りませんもんね…。

メッセージボックスやエラーメッセージなんかはどうでもいいです。(・_・)ノ~ ゚ポイ 
テーブルが存在しない時以外のエラー処理も適当です。o(^∇^)oギャハハハ

ま~とりあえず、今回のコードではテーブル丸ごとコピーですが、
比較した後の処理は他にも色々考えればできそうですね~。
あまり使うこともないでしょうけど…(-。-) ボソッ

えっと…なにやらごちゃごちゃと書きましたが…やっぱり保存用と操作用で
データベースは分けたほうが扱いやすいと…というのが今回の結論…(´Д`)

そんな訳で、このコードもやっぱり無駄なわけで…

ちくしょ~~~ … チャブダイクラッシュ (ノ#-◇-)ノ ~~┻━┻

追記(2011/11/10):
テーブル構造の比較 パート2を作成しました。
↑やる気アップにご協力をお願いします。わぁいヽ(∇⌒ヽ)(ノ⌒∇)ノわぁい♪

こんな記事もありますよ


コメントの投稿

非公開コメント

Author's Profile ~自己紹介~

Genzo

Author:Genzo
PCは一応自作できるレベル。
ワード・エクセルなら基本的に
扱えるレベル。
プログラム・・・?ん?
VBA・・・?ん?ん??
それって美味しいですか?


~ 当ブログについて ~

~ Mail2Genzo  ~

Calender&Search かれんだーと検索

11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

Access2Genzo内で検索

Category ~かてごりー~

Comments Tree ~こめんとつりー~


Link ~りんく~

ブロとも申請フォーム

Counter ~かうんた~

Since 2010/08/01:

Online:

タグクラウド

最新トラックバック

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。