vb.netでデータベース(Access)を複数アクセス(編集)する方法

このQ&Aのポイント
  • vb.netでデータベース(Access)を複数アクセス(編集)する方法についてのご質問です。
  • 実行時に「指定したデータベースは既に開いている」というエラーが表示される問題が発生しています。
  • DBの型の定義やSQLの型の定義を複数用意してもエラーが表示されます。対処方法を教えてください。
回答を見る
  • ベストアンサー

vb.netでデータベース(Access)を複数アクセス(編集)する方

vb.netでデータベース(Access)を複数アクセス(編集)する方法について いつも大変お世話になっています。 vb.netでデータベース(Access)を複数アクセス(編集)する方法についてご教授願います。 'SQL文 Dim wrk_sql As String 'データベース Dim G_DATABASES As New System.Data.OleDb.OleDbConnection 'DBの型を定義 Dim dr As System.Data.OleDb.OleDbDataReader 'SQLの型を定義 Dim cmnd As New System.Data.OleDb.OleDbCommand 'データベースを開く G_DATABASES = DBOpen(D:\test\db1.mdb") 'データ抽出 ※1 wrk_sql = "SELECT * FROM TEST" wrk_sql &= " WHERE N_DATA = 0" cmnd.Connection = G_DATABASES cmnd.CommandText = wrk_sql 'コマンドの実行 dr = cmnd.ExecuteReader() While dr.Read() = True ' ………← ※2 End While <目的> [※1]で抽出した結果(複数行存在します)を保持したまま [※2]の中で同じDB(G_DATABASES)にアクセスし SELECT文で抽出した結果を保持したまま処理を続けたい。 <問題> ・実行時「指定したデータベースは既に開いている」とのエラーが表示。 ・DBの型の定義、SQLの型の定義 を複数用意してもエラーが表示。

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

  • ベストアンサー
回答No.2

DataAdapterを使われたほうがよろしいかと。 '/**コネクションしてテーブル取得**/ Dim Con As OleDbConnection, Cmd As OleDbCommand Dim Provider As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" '接続プロバイダ Dim st As String st = Provider st &= Chr(34) & mdbPATH & Chr(34) & ";" Con.ConnectionString = st Cmd.Connection = Con Dim ds As New DataSet Dim dt As DataTable Dim dbAdapter As OleDbDataAdapter wrk_sql = "SELECT * FROM TEST" wrk_sql &= " WHERE N_DATA = 0" Cmd.CommandText = wrk_sql dbAdapter.SelectCommand = Cmd dbAdapter.Fill(ds, TableName) dt = ds.Tables(TableName) '/******************************************************// あとは、アダプターを使って追加・更新・削除を行なえばOK!!

tekesuta_1985
質問者

お礼

レス遅くなり申し訳ございません。 無事解決いたしました。ご協力ありがとうございます。

その他の回答 (2)

回答No.3

下記の部分について、名前を変えて、もう1セットデータベースを開くというのはどうでしょうか? 'データベース Dim G_DATABASES As New System.Data.OleDb.OleDbConnection 'DBの型を定義 Dim dr As System.Data.OleDb.OleDbDataReader 'SQLの型を定義 Dim cmnd As New System.Data.OleDb.OleDbCommand 'データベースを開く G_DATABASES = DBOpen(D:\test\db1.mdb")

tekesuta_1985
質問者

お礼

レス遅くなり申し訳ございません。 無事解決いたしました。ご協力ありがとうございます。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

DataReader を使っているからでしょう? 該当データを DataTable で全て取得して、接続を閉じれば良いのでは?

tekesuta_1985
質問者

お礼

お早いご返答、誠にありがとうございます。 Dim rsDATFIL As DataTable '※追加 'コマンドの実行 dr = cmnd.ExecuteReader() rsDATFIL = dr.GetSchemaTable '※追加 rsDATFIL.CreateDataReader.Read を行い、テーブル内を覗たのですが ヘッダ情報しか取得できませんでした...

関連するQ&A

  •  お世話になっています。SQLについての質問です。

     お世話になっています。SQLについての質問です。  VB.netでACCESSに接続しデータベースを参照しているのですが "select max([項目1]) AS N_MAXKEY from [テーブル1]" を実行した際、N_MAXKEYの値をGetInt32(0)で取得できませんでした。 N_MAXKEYの値をどのように取得するか方法をご享受ください。宜しくお願いします。 以下、作成したソースコードの一部です。尚、[項目1]は整数型で設定されています。 ======================== Public G_DATABASES As System.Data.OleDb.OleDbConnection  ~(省略)~ Dim wrk_sql As String 'SQL 文字列変数 Dim cmnd As New System.Data.OleDb.OleDbCommand Dim dr As System.Data.OleDb.OleDbDataReader Dim intTest As Integer = 0  ~(省略)~  wrk_sql = "select max([項目1]) AS N_MAXKEY from [テーブル1]"    cmnd.Connection = G_DATABASES  cmnd.CommandType = CommandType.Text  cmnd.CommandText = wrk_sql  dr = cmnd.ExecuteReader()  intTest = dr.GetInt32(0) ’値を取得できない(´・ω・`) ========================

  • VB2008データベース

    非接続型データベースでUpdateをする文を書いていますがUpdateでエラーが出てしまいます。  OleDbCommandBuilder の参照をネットで確認等していますがエラーの内容がわかりません。 データベース参考書等にも下記と同じ文例でかいてあります。 どなたか教えてください。 *VB2008で開発しています。 Dim cn As OleDb.OleDbConnection Dim Buf As String Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet Dim dTbl As DataTable Dim cBuild As OleDb.OleDbCommandBuilder Buf$ = DefCnSt$ & X_SystemFile$ & ";Jet OLEDB:Database Password=" & XdtPs$ cn = New OleDb.OleDbConnection(Buf$) dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 物件", cn) dSet = New DataSet("物件") dAdp.Fill(dSet, "物件") dTbl = dSet.Tables("物件") dTbl.Rows(2)(1) = "ABC" cBuild = New OleDb.OleDbCommandBuilder(dAdp) dAdp.Update(dSet, "物件") <-ここでエラーが出ます。

  • VB.net教えてくださいm(__)m(初心者)

    VB.netで、ACCESSのデータベース(以下DB)に接続して、DBの内容を、ブラウザ上でVB.netのコントロール"DataGrid"(以下DG)に表示させるプログラムを作成しています。 Dim dc As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\練習フォルダ\練習データベース.mdb")  dc.Open()  Dim cmd As New OleDb.OleDbCommand _  ("SELECT mikan,ringo,nasi,budou from Q_フルー  ツ", dc)  dgITIRAN.DataSource = cmd.ExecuteReader()  dgITIRAN.DataBind()  dc.Close() 以上のソースで、画面に表示させるところまではできたのですが・・・。 1.コード上で、DBのレコード数が知りたいのですが(DB上にいくつデータがあるかを変数にいれたい)どのように記述すればよいでしょうか? 2.例えば、データが20件あって、ページングの設定で10件しか表示させない場合、コマンドボタン「前ページ」と「後ページ」を作った場合、どのようなコードを書けばよいでしょうか?

  • VB2005でACCESSのADO.NETでのテーブル名取得

    VB2005 ACCESSのテーブル名を取得したいのですが、方法をご教示ください。以下のところで悩んでいます。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then Dim St As String Dim Cn As New System.Data.OleDb.OleDbConnection Dim SQL As System.Data.OleDb.OleDbCommand Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand    Cn.Open() この後テーブル名までたどり着けません DataTable  Cn.GetSchema Cn.GetOleDbSchemaTable( "restrictions") などヘルプなどから試みていますが、これらのコーディング法がわかりません。 テーブル名がわかっている(サンプルのPubs の "Publisher")場合はデータセットからはフィールド名が取得できたのですが・・・ よろしくお願いいたします。

  • アクセスDbのテーブル名の取得(VB2005)

    再度の質問です アクセスDBのテーブル名を取得したのですが、方法をご教示ください。DAOでは tabledefsでとれたのですが・・ 以下のコードで先に進めません。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then Dim St As String Dim Cn As New System.Data.OleDb.OleDbConnection Dim SQL As System.Data.OleDb.OleDbCommand Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand Cn.Open() Dim tbl As DataTable tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) ここでtblを見ると TABLE_CATALOG _SCHEMA _NAME _TYPE ・・・DATE_MODIFIED などは見えるのですが、これがDB内のテーブル数だけ繰り返されます。 取得したいのは、TABLE_NAME に ある 例えば "Pub-ID"に相当する内容なのですが、HELPで探しても、その方法がわかりません、ぜひ教えてください。よろしくお願いいたします。

  • Access2002 VB がエラー

    Access2002 VBで以下のコーディングをしてます Dim db As Database Dim rs As Recordset Dim fld As Field Set db = CurrentDb Set rs = db.OpenRecordset("ConvertChar") これを実行するとdb宣言行で以下のエラーが表示されます。 コンパイルエラー: ユーザ定義型は定義されていません。 これは何が原因でエラーとなるのでしょうか? 宜しくお願いします。

  • ASP.NET(VB.NET)でADO.NETを使ってAccessデータベースに接続する方法(長文)

    ASP.NETでADO.NETを使ってAccessデータベースに接続し、table2という名前のテーブルのidをテキストボックスに入力し、ボタンを押すとデータグリッドでそのidのデータが表示されるアプリケーションを作りました。が、自分で書いていても意味がわかりません。手元にあるのはASP.NETでSQLServerに接続する方法について解説してある書籍と、Accessに接続するもののWindowsアプリケーションからの接続(しかも表示させる物が違う)について解説してある書籍のみです。これらを組み合わせてなんとか表示させるまではできたのですが、全く意味がわかりません。どなたかご解説いただけないでしょうか? また、ASP.NET(VB.NET)でAccessデータベースと接続するアプリケーションについて触れてあるような書籍をご存知の方がいらっしゃいましたら、是非教えていただけないでしょうか?よろしくお願いいたします。 以下はボタンクリックされたときのイベントハンドラです。コードの先頭でImports System.Data.OleDbしてあります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dt As Integer Dim cn As New OleDbConnection("provider=microsoft.jet.oledb.4.0; Data Source=C:\nabe\採用\新人研修用\.NETコース\DB\kensyu2.mdb;") cn.Open() Dim cmd As New OleDbCommand("select * from table2 where id =?", cn) cmd.Parameters.Clear() cmd.Parameters.Add("param1", TextBox1.Text) dt = CType(cmd.ExecuteScalar(), Integer) Dim dr As OleDbDataReader = cmd.ExecuteReader() DataGrid1.DataSource = dr DataGrid1.DataBind() dr.Close() cn.Close() End Sub

  • VB 2010 Expressでのデータベース利用

    現在Microsoft VisualBasic 2010 Expressにて、データベースを利用してアプリケーションを作成しようとしています。 今まではMS Access にて制作しておりましたので、完全な初心者というわけではありませんが、VB2010Express を使ってのソフト作成は初めてです。 データベースエクスプローラーを使ってデータの接続や、データセットを作成してのデータの編集はできました。 ここからが質問ですが、直接コードを書き込みデータベース操作をする際のデータベースへの接続方法がわかりません。 VBの書籍やヘルプを参考にして以下のようなコードを作成しました。 Dim scn As New OleDb.OleDbConnection scn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ファイル名" scn.Open() (以下省略)~ このコードを実行すると次のようなエラーがでます。 「OleDb.OleDbException はハンドルされませんでした。 データベースの形式 'ファイル名' を認識できません。」 ファイル名(C:\Users\~\ファイル名.sdf)はデータベースエクスプローラーで作成したSQL Server Compact 3.5 のデータベースファイルです。 単純にデータベースエクスプローラーで作成したデータベースに、上記コードで接続することはできないのでしょうか? また、コードに間違いなどはありますでしょうか? よろしくお願いします。

  • VBにアクセスのデータベースを読み込みたい(変数の定義)

    こんにちわM(__)M VB超初心者です・・・ 一度テキストにそってアクセスのデータベースをVBで読み込んで、リストを表示したり・・・データを削除したり・・・といったものを作ったことがあるのですが、だいぶ忘れてしまいました。 (SQLというんでしたっけ?) 読み込んでからの処理はこれからいろいろヘルプなので調べていけば解決すると思うのですが、まず読み込む段階ではじめに変数の定義をしますよね? どうやらその変数の定義ができていないらしく、「ユーザー型変数の定義がされていません」といったエラーがでます(実行時) Public wspace As Workspace のWorkspaceが確かに青くなりません。 以前はこれを解決するために、コンポーネントの追加?みたいのでなにか機能を追加したような気がするのですが(人に聞いてやったのテキストがありません・・・)どの機能を追加したのか、思い出せないのです>< この変数の定義さえできれば後は進んでいけると思いますので、この点だけ教えていただきたいです。 またはアクセスデータベースを読み込む解説みたいのがのっているサイトがありましたら教えていただきたいです。(初心者でも理解できるもので) よろしくお願いしますM(__)M

  • 【VB】データグリッドに読み込んだテーブルの変更を元のデータベースに反映させたい

    VB歴6ヶ月です。 VBのバージョンは2005です。 mdbから読み込んだデータベースをデータグリッドビューコントロールで表示しました。 CNには接続パスが入っていてmdbとの接続は確立しています。 データグリッドビューコントロールのオブジェクト名はDGVです。 読み込むテーブル名はt社員マスターです。 Private sub メンテナンス() Dim DS As DataSet = New DataSet("社員マスター") Dim SQL As String = "SELECT * FROM t社員マスター" Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(SQL, CN) DA.Fill(DS, "社員マスター") Dim DV As DataView = New DataView(DS.Tables("社員マスター")) DGV.DataSource = DV End sub これでグリッドに読み込ますことはできたのですが、 読み込んだデータをグリッド上で変更したら元のデータベースにも反映したいのですが やり方がわかりません >< 具体的なコード、やり方を教えていただけたらありがたいです。

専門家に質問してみよう