| MSDE FunClub |
|
最終更新日 : 2000/10/23 |
| Microsoft Data Engine FunClub |
|
|
| SQLServer7.0/MSDE 完全トレーニングテキスト(下巻) | ||
|
【第18章例題8】 内部形式ファイルを利用したimage型データ操作 |
||
CREATE TABLE FILEDB (
ID char(6) PRIMARY KEY , --レコード識別文字列6桁
FNAME varchar(128) , --ファイル名を記憶する
DAT image --ファイルの中身
)
'
'********************************************************************
'
' 【ファイル管理データベース】
'
' このプログラムは、ファイルの内容をimage型データとしてMSDE/SQLServer7.0
' で管理するものです
'
' (株)日本技術ソフト開発 堀川 明
' http://www.horikawa.ne.jp/msde/
'
'********************************************************************
'
Option Explicit
Const ServerName = "DB_Server_Name" '接続先データベースサーバーの名前
Const LoginName = "Login_Name" 'ログイン名
Const PassWord = "PassWord" 'パスワード
Const DBNAME = "DB_Name" 'データベースの名前
Const SQL7PATH = "D:\MSSQL7\BINN" 'MSDE/SQL7のコマンドが存在する場所
Const SQL7DRIVE = "D:" 'インストールしたドライブ名
Const WORKFN = "D:\Test\Work.tmp" '一時作業用ファイル名
'Windows-API関数宣言
Const PROCESS_ALL_ACCESS = 2035711
Const TRUE_API = 1
Const INFINITE = -1
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
'
'********************************************
' フォーム読み込み時の初期化処理
'********************************************
'
Private Sub Form_Load()
'アプリケーションのカレントディレクトリを設定する
ChDir SQL7DRIVE
ChDir SQL7PATH
'MsgBox CurDir
End Sub
'
'********************************************
' データベースを新規に作成します(初期化処理)
'********************************************
'
Private Sub CMDCreate_Click()
Dim sql$
If MsgBox("既存のDBを削除して、DBを新規に作成します。よろしいですか?", vbOKCancel + vbDefaultButton2, "DBの新規作成") = vbCancel Then
MsgBox "キャンセルしました", , "中止"
Exit Sub
End If
'DB新規作成のSQL文
sql$ = "IF EXISTS( SELECT name FROM master..sysdatabases WHERE( name = '" & DBNAME & "') )" & vbCrLf & _
" BEGIN " & vbCrLf & _
" DROP DATABASE " & DBNAME & vbCrLf & _
" END " & vbCrLf & _
"CREATE DATABASE " & DBNAME & vbCrLf
ExecQuery sql$
MsgBox DBNAME & "データベースを作成しました", , "DB作成"
End Sub
'
'********************************************
' テーブルの作成処理
'********************************************
'
Private Sub CMDTBL_Click()
Dim sql$
If MsgBox("既存のテーブルを削除して、テーブルを新規に作成します。よろしいですか?", vbOKCancel + vbDefaultButton2, "テーブルの新規作成") = vbCancel Then
MsgBox "キャンセルしました", , "中止"
Exit Sub
End If
'DB新規作成のSQL文
sql$ = "USE " & DBNAME & vbCrLf & _
"IF EXISTS( SELECT name FROM sysobjects WHERE( name = 'FILEDB' AND type = 'U ') )" & vbCrLf & _
" BEGIN " & vbCrLf & _
" DROP TABLE FILEDB " & vbCrLf & _
" END " & vbCrLf & _
"CREATE TABLE FILEDB ( " & vbCrLf & _
" ID char(6) PRIMARY KEY , " & vbCrLf & _
" FNAME varchar(128) , " & vbCrLf & _
" DAT image " & vbCrLf & _
")"
ExecQuery sql$
MsgBox DBNAME & "テーブルを作成しました", , "テーブルの作成"
End Sub
'
'********************************************
' ファイル名の選択
' コモンダイアログコントロール操作
'********************************************
'
Private Sub CMDFile_Click()
Dim fnm
CommonDialog1.Filter = "すべてのファイル(*.*)|*.*"
CommonDialog1.ShowOpen
Me!FNAME = CommonDialog1.FileName
End Sub
'
'********************************************
' テーブルにレコードを書き込む
'********************************************
'
Private Sub CMDUP_Click()
Dim dt&
'チェック
If Me!ID = "" Then Exit Sub
If Len(Me!ID) <> 6 Then Exit Sub '主キーは6文字
If Me!FNAME = "" Then Exit Sub
'ファイルが存在しないとダメ
On Error GoTo NO_FILE
dt = FileLen(Me!FNAME)
On Error GoTo 0
GoTo L100
NO_FILE:
On Error GoTo 0
MsgBox "ファイル名[" & Me!FNAME & "]が存在しません", , "ファイルがありません"
Exit Sub
L100:
Dim fno%, fno2%, ln%, pk$, fn$, cmd$, fln&, i&, tid&, phd&
Dim cb As Byte
'作業用ファイルを削除する
DELWORKFN
'レコード挿入用データファイルを作成する
'[6バイト][2バイト(大きさ)][varchar文字列][4バイト(大きさ)][ファイル本体]
'このようなレコードを作成する
fno = FreeFile
Open WORKFN For Binary As #fno
'先頭6バイトの書き込み
pk$ = Me!ID
Put #fno, , pk$
'ファイル名の文字数(Shift-JISの文字数計算)
fn$ = Me!FNAME
ln% = LenB(StrConv(fn$, vbFromUnicode))
Put #fno, , ln%
Put #fno, , fn$
'ファイル本体の大きさ
fln& = FileLen(fn$) 'バイト数
Put #fno, , fln& '4バイトで書き込む
'ファイルの中身の転送
fno2 = FreeFile
Open fn$ For Binary As #fno2
For i& = 0 To (fln& - 1)
Get #fno2, , cb
Put #fno, , cb
Next
Close #fno2
'作業用ファイルの作成
Close #fno
'レコード挿入bcpコマンドの作成
cmd$ = "bcp " & DBNAME & "..FILEDB in " & WORKFN & " -n -S" & _
ServerName & " -U" & LoginName & " -P" & PassWord
MsgBox cmd$, , "BCPコマンドによりレコード挿入処理の実行"
tid& = Shell(cmd$)
'プロセスのハンドルに変換する
phd& = OpenProcess(PROCESS_ALL_ACCESS, TRUE_API, tid&)
'プロセスが終了するまで待機する
WaitForSingleObject phd&, INFINITE
CloseHandle phd&
MsgBox "データベースに書き込みました", , "終了しました"
End Sub
'
'********************************************
' レコードを取得する
'********************************************
'
Private Sub CMDDown_Click()
Dim dt&
Dim fno%, fno2%, ln%, i&, pk$, fn$, cmd$, fln&, tid&, phd&
Dim cb As Byte
'チェック
If Me!ID = "" Then Exit Sub
If Len(Me!ID) <> 6 Then Exit Sub '主キーは6文字
If Me!FNAME = "" Then Exit Sub
'念ため、存在するファイル名はダメ
fn$ = Me!FNAME
On Error GoTo NO_FILE
dt = FileLen(fn$)
On Error GoTo 0
MsgBox "同じ名前のファイル名があります。上書き禁止です", , _
"存在しないファイル名を入力してください"
Exit Sub
NO_FILE:
On Error GoTo 0
'作業用ファイルを削除する
DELWORKFN
'レコード取得bcpコマンドの作成
cmd$ = "bcp ""SELECT * FROM " & DBNAME & "..FILEDB WHERE(ID='" & Me!ID & "') """ & _
" queryout " & WORKFN & " -n -S" & _
ServerName & " -U" & LoginName & " -P" & PassWord
MsgBox cmd$, , "BCPコマンドによりレコード取得処理の実行"
'タスクIDを取得
tid& = Shell(cmd$)
'プロセスのハンドルに変換する
phd& = OpenProcess(PROCESS_ALL_ACCESS, TRUE_API, tid&)
'プロセスが終了するまで待機する
WaitForSingleObject phd&, INFINITE
CloseHandle phd&
'レコード挿入用データファイルを作成する
'[6バイト][2バイト(大きさ)][varchar文字列][4バイト(大きさ)][ファイル本体]
'このようなレコードを作成する
fno = FreeFile
Open WORKFN For Binary As #fno
'先頭6バイトの読み込み
pk$ = "123456"
Get #fno, , pk$
MsgBox pk$, , "読み出した主キーの値"
'ファイル名の文字数(Shift-JISの文字数)
Get #fno, , ln%
'ファイル名の読み出し
Dim cba() As Byte
ReDim cba(ln%)
'1バイト単位で文字コードの読み出し(シフトJISコード)
For i = 0 To (ln% - 1): Get #fno, , cb: cba(i) = cb: Next
MsgBox StrConv(cba, vbUnicode), , "読み出したファイル名"
Erase cba()
'ファイル本体の大きさ
Get #fno, , fln&
'ファイルの中身の転送
fno2 = FreeFile
Open fn$ For Binary As #fno2
For i& = 0 To (fln& - 1)
Get #fno, , cb
Put #fno2, , cb
'***Debug.Print cb
Next
Close #fno2
'作業用ファイルの作成
Close #fno
MsgBox "データベースからファイルの内容を取得しました", , "終了"
End Sub
'
'********************************************
' 更新系クエリーの実行を行ないます
'********************************************
'
Sub ExecQuery(sql$)
Dim cmd$
'OSQLコマンドによる実行
cmd$ = "OSQL -S" & ServerName & " -U" & LoginName & " -P" & PassWord & _
" -Q""" & sql$ & """"
MsgBox cmd$
'SHELLによるコマンドの実行
Shell cmd$
End Sub
'
'********************************************
' 作業用ファイルを削除する
'********************************************
'
Sub DELWORKFN()
On Error GoTo L10 '削除するファイルが存在しないとエラーの発生
Kill WORKFN
L10:
On Error GoTo 0
End Sub