DAO VB2005 で DAO を使用して Excel のデータを取得 Visual Basic 6.0 Dim DB As DAO.Database Dim RS As DAO.Recordset Dim xlfilename As String Dim xlsheetname As String xlfilename = Form1.StatusBar1.Panels(12) & Dir(Form1.StatusBar1.Panels(12) & _ " ファイル名 " & "*.xls") xlsheetname = " シート名 " & "$" Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;IMEX=1") Set RS = DB.OpenRecordset(xlSheetName) Dim DB As DAO.Database Dim RS As DAO.Recordset Dim xlfilename As String Dim xlsheetname As String xlfilename = DataSheetPath & Dir(DataSheetPath & " ファイル名 " & "*.xls") xlsheetname = " シート名 " & "$" DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;IMEX=1") RS = DB.OpenRecordset(xlSheetName) 'Recordset オブジェクトのオープン 名前 'OpenDatabase' は宣言されて居ませんと謂うエラーに成る 斯う謂う時は OpenDatabase が 何のオブジェクトのメソッドで有るかを調べると解決する DAO のヘルプやオブジェクトブラウザで確認すると OpenRecordset が DBEngine 及び Workspace のメンバで有る事を確認出来る筈で有る DBEngine とは DAO の最上位に有るオブジェクトなので 先ずは其れを下記の様に生成し 此のオブジェクトから辿って行けば良い Dim engine As New DAO.DBEngine( ) 本来で有れば VB6 でも DBEngine オブジェクトを生成す可きなのだが DBEngine はグローバルオブジェクトに成って居るので VB6 では宣言を省略する事が出来たので有る Marshal.ReleaseComObject に依るオブジェクトの解放処理も記述して有るので 多少冗長なコードに見えるかも知れないが 下記に具体例を示す -1-
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load ' DAO のオブジェクト生成 Dim engine As New dao.dbengine( ) Dim db As dao.database = _ engine.opendatabase("c: test.xls", False, False, "Excel 8.0;HDR=NO;IMEX=1") Dim rs As dao.recordset = db.openrecordset("sheet1$") ' 画面表示用の DataTable の準備 table = ds.tables.add("sheet1") Dim fs As dao.fields = rs.fields Dim maxcount As Integer = fs.count - 1 Dim f(maxcount) As dao.field f(n) = fs(n) table.columns.add(f(n).name) ' Recordset から読み込んで DataTable に格納 Do Until rs.eof Dim items As New ArrayList() items.add(f(n).value) table.rows.add(items.toarray()) rs.move() Loop ' DAO オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(f(n)) System.Runtime.InteropServices.Marshal.ReleaseComObject(fs) rs.close() System.Runtime.InteropServices.Marshal.ReleaseComObject(rs) db.close() System.Runtime.InteropServices.Marshal.ReleaseComObject(db) System.Runtime.InteropServices.Marshal.ReleaseComObject(engine) ' 画面に表示 DAO の.Fields は COM オブジェクトなので Fields(0) を使う前に.Fields を変数に受け 其の変 -2-
数から (0) を得る様にし 最後に 其の変数を Marshal.ReleaseComObject で解放せねば成らない (ADO.NET の場合は COM オブジェクトではないので 然うした手間は不要で有る ) 上記の例では rs.fields(0).value の構文を使わず 態々 rs.fields を dao.fields 型の変数 fs に入れて置き 其処から更に fs(0) で得たオブジェクトを dao.field 型の変数配列 f に受け 最後に 其等のオブジェクトを Marshal.ReleaseComObject して居る 但し 本当は DAO に頼るよりも ADO.NET( 或いは ADO) に依るデータアクセスに移行す可きで有る 其の方が解放処理も簡単で有る 下記に ADO 版を示す DataAdapter に依るサポートが有るので DAO よりも扱い易いと想う Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load Dim constr As New OleDb.OleDbConnectionStringBuilder() constr.provider = "Microsoft.JET.OLEDB.4.0" constr.datasource = "C: test.xls" constr("extended Properties") = "Excel 8.0;HDR=NO;IMEX=1" ' ADO のオブジェクト生成 Dim rs As New ADODB.RecordsetClass() rs.cursorlocation = ADODB.CursorLocationEnum.adUseClient rs.open("sheet1$", constr.connectionstring,,, _ ADODB.CommandTypeEnum.adCmdTableDirect) ' 画面表示用の DataTable に読込 Using da As New OleDb.OleDbDataAdapter() da.fill(ds, rs, "Sheet1") End Using table = ds.tables("sheet1") ' ADO オブジェクトの解放 If System.Runtime.InteropServices.Marshal.IsComObject(rs) Then System.Runtime.InteropServices.Marshal.ReleaseComObject(rs) End If ' 画面に表示 最後に ADO.NET 版を下記に示す 此の場合 COM オブジェクトの解放処理が不要に成る -3-
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load Dim constr As New OleDb.OleDbConnectionStringBuilder() constr.provider = "Microsoft.JET.OLEDB.4.0" constr.datasource = "C: test.xls" constr("extended Properties") = "Excel 8.0;HDR=NO;IMEX=1" Dim sql As String = "SELECT * FROM [Sheet1$]" Using da As New OleDb.OleDbDataAdapter(sql, constr.connectionstring) da.fill(ds, "Sheet1") End Using table = ds.tables("sheet1") VB2005 で DAO レコードセットの更新 Dim Myquerydef As dao.querydef Dim strsql As String Dim rs As dao.recordset Dim i As String Dim j As String Dim DAODBEngine As New dao.dbengine db = DAODBEngine.OpenDatabase(mypath) i = [ 生徒区分 ID].Text 'j = Format(i, "'00'") On Error Resume strsql = "SELECT * From M_ 生徒区分 " ' WHERE 生徒区分 ID=" & i Myquerydef = db.createquerydef("", strsql) rs = Myquerydef.OpenRecordset(dao.RecordsetTypeEnum.dbOpenSnapshot) With rs.addnew().fields(" 生徒区分 ID").Value = [ 生徒区分 ID].Text.Fields(" 生徒区分 ").Value = [ 生徒区分 ].Text.Update() End With rs.close() dbopensnapshot だと更新不可で dbopendynaset にする -4-
VB2005 を使って ACCESS のテーブルを別のデータベースにエクスポート Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; C: A.mdb") Dim cmd As OleDbCommand = cn.createcommand Dim strsql As String strsql = "select * into [;database=c: B.mdb].[B.mdb に追加するテーブル名 ] " & _ "FROM [ エクスポートさせるテーブル名 ]" cmd.commandtext = (strsql) cn.open() cmd.executenonquery() cn.close() 少しだけ手直しすれば 動作する -5-