OleDbで、1レコード分のデータを読み出す方法とカレントレコードのデータを取得する方法

このQ&Aのポイント
  • VB6とADOを使用してMS-Accessのmdbファイルに接続していましたが、VB2010のExpress版に移行し、OleDbを使用してデータを読み出す方法を学んでいます。
  • test.mdb内のtable1テーブルのfields1の値をListViewコントロールに表示させることはできましたが、OleDbでレコードを移動する方法やカレントレコードのデータを取得する方法が分からないです。
  • Googleで検索しても、全データを読み出す方法は見つかりますが、カレントレコードのデータだけを取得する方法が分かりません。VBは趣味で初心者なので、基本的な質問ですが、教えていただけますか?
回答を見る
  • ベストアンサー

OleDbで、1レコード分のデータを読み出したい。

これまで、VB6とADOを使って、MS-Accessのmdbファイルに接続していました。 ようやく、.netに移行しようと思い、VB2010のExpress版で勉強を始めました。 以下の方法で、test.mdb内のtable1テーブルのfields1の値を、ListViewコントロールに表示させることはできました。 Imports System.Data.OleDb Public Class Form1 Private oleConn As New OleDbConnection Private oleCmd As New OleDbCommand Private oleReader As OleDbDataReader   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     Dim strConnect As String     strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =test.mdb"     oleConn.ConnectionString = strConnect     oleConn.Open()     oleCmd = oleConn.CreateCommand     oleCmd.CommandText = "SELECT * FROM table1"     oleReader = oleCmd.ExecuteReader()     While(oleReader.Read())       ListView1.Items.Add(oleReader.Item("fields1"))     End While   End Sub End Class 質問は2点です。 1.ADOのRecordSetのMove系メッソッド(.movenext、.moveprevious等)で、レコードを移動するように、OleDbでレコードを移動する方法。 2.ADOのRecordSetのFieldsコントロールのように、カレントレコードのデータを、OleDbで読み出す方法。 Googleで検索しても、ループで全データを読み出す方法はいろいろ見つかるのですが、カレントレコードのデータだけを読み出す方法が分かりません。 oleReader = oleCmd.ExecuteReader() の直後に Me.Text = oleReader.Item("fields1") を記述しても、エラーとなってしまいます。 VBは趣味でやっており、基本的質問ですが、よろしくお願いします。

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

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

http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbdatareader(v=VS.100).aspx MSDN の説明通り、前方向ストリームですので moveprevious できません。 データ読込み行がカレントレコードです。 > Googleで検索しても、ループで全データを読み出す方法はいろいろ > 見つかるのですが、カレントレコードのデータだけを読み出す方法 > が分かりません。 おかしな表現ですね。ループで全データを読み出せるなら、ループ しなければカレントレコードのデータだけ読み出せるのでは? テーブルの全データをカレントレコードを自由に移動させながら 操作するのであれば、使用目的が違います。 DataTable を利用して下さい。

MusaGoro
質問者

お礼

その後、いろいろ調べDataTableを使用すれば良さそう、というところまでは分かりました。 もっと勉強します。 ありがとうございました。

関連するQ&A

  • Excel VBA : Accessのデータを検索

    Excel VBA を使って、Accessのデータを検索したい。 除外テーブルには「管理ID」レコードが在り、ユニークな番号を登録してあります。 やりたいことは、除外テーブルの管理IDに在るであろう、"E003"の有無を確認したいと思います。 作ってみたソースコードは、以下の通り。 Private Sub aSearch_Click() DB.TableOpen ("db_name.mdb") 'Accessのファイル DB.FindRecode ("E003")  ' 検索対象文字列 DB.TableClose End Sub ------------------------------ここから、標準モジュール Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public fSql As String Public fRow As Integer 'データ ソースへの接続と、レコードセットへの接続 Sub TableOpen(ByVal mdb_name As String) Set adoCn = New ADODB.Connection 'データ ソースへの接続 adoCn.Provider = "Microsoft.Jet.OLEDB.4.0" 'Accessへ接続プロバイダ名 adoCn.Open mdb_name '接続するmdbファイル名" fSql = "select 管理ID from 除外テーブル" Set adoRs = New ADODB.Recordset 'レコードセットへの接続 adoRs.Open fSql, adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 ' adoRs.Open "除外テーブル", adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 End Sub 'レコード(管理ID)の検索 Function FindRecode(ByVal findName As String) As String adoRs.Find adoRs.Fields("管理ID") & "=" & findName     '← ここでエラーとなる  If adoRs.RecordCount = 0 Then MsgBox "該当するレコードは存在しません" FindRecode = "" Exit Function Else Do     ' Doループは、要らないかも??? Debug.Print adoRs.Fields("管理ID") & "/" & adoRs.Fields("登録日") adoRs.MoveNext Loop Until adoRs.EOF End If FindRecode = adoRs.Fields("管理ID") End Function 'データ ソースへの接続と、レコードセットを切断する Sub TableClose() adoRs.Close 'クエリーを閉じる adoCn.Close 'データ接続を閉じる Set adoRs = Nothing Set adoCn = Nothing End Sub ------------- ここまで データのソースから、検索する方法が良く判っておらず、Open / find の使い方はこれで良いのでしょうか。 以上、よろしくお願いします。

  • データグリッドコントロールに表示されません!

    OS:XP、VB6、ACCESS2000の環境でADOの勉強をしています。 ある参考書を見て、次のサンプルを実行しました。 【サンプル】 フォームにデータグリッドコントロールを貼り付ける。 フォームのLoadイベントプロシージャ内でデータベース(MDB)に接続し、レコードセットを取得して、データグリッドコントロールに取得したレコードセットを表示させる。 データベースはACCESS97で作成されたものです。 (ソース) --------------------------------------------------------------- Option Explicit Private cn As ADODB.Connection Private rs As ADODB.Recordset Private Sub Form_Load() 'データーベースに接続 Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=G:\VB_TEST\Book.mdb" cn.Open 'レコードセットを取得 Set rs = New ADODB.Recordset rs.Open "本", cn, adOpenStatic 'データグリッドコントロールに取得したレコードセットを表示 Set DataGrid1.DataSource = rs End Sub --------------------------------------------------------------- 上記のプログラムを実行するともちろんうまく表示されました。 が、接続プロバイダ名を "Provider=Microsoft.Jet.OLEDB.3.51;"  ↓↓↓↓↓ "Provider=Microsoft.Jet.OLEDB.4.0;" にすると表示されません。 そこで、データベースをACCESS2000で作成し直し、実行してもダメです。 この処理はJet4.0では出来ないのでしょうか?

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • SQLでの処理

    開発環境:WindowsXP、VB6、Access2000 ADO接続前提 ファイル全体のデータ(全レコード)に対して連続して処理するにはSQLで対応するのがいいのだと思いますが やりかたがわかりません。 たとえば、つぎのようなAccessのファイルがあったとします。 ファイル名:kojin.mdb テーブル名:name_tbl 名前 年齢 性別   太郎 20 M    花子 40 F 三郎 30 M 洋子 50 F 質問1 年齢順にレコードを並べかえる。 質問2 性別のFをWに一括変換する。 なお、SQLの文法を質問しているのではありません。 下のプログラム1でレコード表示を行ってます。 また、省略しますが、次のレコードや前のレコードを表示したり、レコードの更新・追加・削除などを行うこともできています。 これからどうすればSQL文を使って質問1や2の処理が可能になるのでしょうか? ご教授お願いしたします。 <プログラム1> Private mCn As ADODB.Connection Private mRs As ADODB.Recordset Private DBfile As String 'DBファイル名 Private DBtable As String 'テーブル名 Private Sub Form_Load()  DBfile = "kojin.mdb"  DBtable = "name_tbl"  Call ConnectType  Call SetFields End Sub Private Sub ConnectType() 'DB接続準備処理   Set mCn = New ADODB.Connection   mCn.ConnectionString = DEF_CONNECT & App.Path & "\" & DBfile   mCn.Open   Set mRs = New ADODB.Recordset   mRs.Source = DBtable   mRs.ActiveConnection = mCn   mRs.CursorType = adOpenDynamic   mRs.LockType = adLockOptimistic   mRs.Open End Sub Private Sub SetFields()  Text1.Text = mRs.Fields("名前")  Text2.Text = mRs.Fields("年齢i")  Text3.Text = mRs.Fields("性別") End Sub

  • MDBをADO接続でINSERT・UPDATE・DELETE

    VB2005.NETの初級開発者です。 MDBをADO接続で開発を行いたいのですが 記述の方法がわかりませんので教えて下さい。 下記のようなサンプルはネット上でもよく見るのですが INSERT分で記述を行いたいのですが、サンプルが見つかりません よろしくお願いします。 後、CurrentProject.Connection.Execute strSQL, , adCmdTex このような記述をネット上で見るのですがstrSQLにInsert分を 記述すれば良いのですか、わからないので教えて下さい。 また、下記の記述の方がよいのですか? Dim ct As New Connection() Dim rt As New Recordset() ' 接続文字列を設定 ct.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\test.mdb" ' データベースに接続 ct.Open() ' テーブルを指定し、レコードセットをオープン With rt .CursorType = CursorTypeEnum.adOpenDynamic .LockType = LockTypeEnum.adLockOptimistic .Open("Insert_Tbl", ct, , , CommandTypeEnum.adCmdTable) End With ' データを追加 With rt .AddNew() .Fields("aaa").Value = TextBox1.Text .Fields("bbb").Value = TextBox2.Text .Update() End With

  • なぜか、全レコードを取得してくれません・・・

    VB.NETでコーディング、デバッグ実行中です。 「区分マスタ」テーブルには、現在5レコードのデータがありますが、先頭から2レコードしかデータを取得してくれません。 oDataReader.Read()が2回目でFalseとなってWhileが終了してしまいます。 原因お分かりの方、いらっしゃいますでしょうか? ----------------------------------------------- Public Function getKubunAll(ByRef kubunInfo() As structKubun) As String  Const strSelectSyain As String = "SELECT * FROM 区分マスタ ORDER BY 区分コード"  Dim oConn As New OleDbConnection  Dim oCommand As New OleDbCommand  Dim oDataReader As OleDbDataReader  Dim i As Integer  Try   oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\TEST.mdb"   oCommand.Connection = oConn   oCommand.CommandText = strSelectSyain   oConn.Open()   oDataReader = oCommand.ExecuteReader()   i = -1   While oDataReader.Read()    'レコードが取得できた時の処理    i = i + 1    ReDim Preserve kubunInfo(i)    kubunInfo(i).kubunCode = CStr(oDataReader("区分コード"))    kubunInfo(i).syoriNaiyou = CStr(oDataReader("処理内容"))   End While        ・        ・        ・        ・ End Function

  • ADOを使いDBへ読み書きしたい

    VB初心者です。よろしくお願いします。 今、VBのActiveXドキュメントを使い、ブラウザ上で利用できるシステムを作ろうと思っています。その際、Textboxに入力されたデータをADOを使いAccess2003に格納したいのですが、うまくいきません。DAOではうまくいきました。 コードは以下の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst1 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = 'データへのパス'\zaseki3.mdb" db.Open MsgBox ("接続成功") Set rst1 = New ADODB.Recordset ☆☆rst1.Open "T-利用者", db,adOpenForwardOnly,adLockOptimistic   With rst1 .AddNew .Fields("氏名") = Text1 .Update End With rst1.Close db.Close Set db = Nothing Set rst1 = Nothing End Sub ☆☆のところでエラーが発生します。エラー内容は次の通りです。  実行時エラー'-2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'などを使用してく ださい。 環境は Windows XP, VB6.0, Access2003  です。 よろしくお願いします。

  • データベース操作時エラーについて

    VB初心者です。 VB6+Access2000の環境下でプログラムを実行すると 「実行時エラー’3219’ このコンテキストで操作は許可されていません」とエラーになります。 下のプログラムの(2)の箇所でエラーになります。 (1)はエラーになりません。 つまり次のレコードに移動は問題ないのですが、前のレコードを表示 させようとするとエラーになります。 原因と解決方法をご教授ください。 ----------------------------------------------------------- プログラム Private mCn As ADODB.Connection Private mRs As ADODB.Recordset --------------------------------- Private Sub Form_Load() Set mCn = New ADODB.Connection mCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data    Source=.\word.mdb" mCn.Open Set mRs = mCn.Execute("Select * From week_cel") End Sub --------------------------------- Private Sub Command1_Click() ’(1) mRs.MovePrevious If mRs.BOF Then mRs.MoveFirst End If End Sub -------------------------------- Private Sub Command2_Click() ’(2)   mRs.MoveNext If mRs.EOF Then mRs.MoveLast End If End Sub   

  • MDBテーブルへの追加変更を教えてください

    いつもお世話になってます。VB2005の初心者の質問です。 データの変更頻度が少ないのでMDBテーブルをDataGridViewの表示させて行の状態から追加変更したいのですが肝心な部分がわかりません。 DB名=NO.MDB テーブル名=番号 (IDNO、addres、TELNO の3項目です) Private Sub 更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 更新.Click Dim dSet As DataSet = New DataSet("番号") Dim cn As OleDb.OleDbConnection =   NewOleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=NO.mdb;") Dim dRow As DataRow Dim dTbl As DataTable Dim i As Integer dTbl = DataGridView1.DataSource For i = 0 To dTbl.Rows.Count - 1 If dTbl.Rows(i).RowState = DataRowState.Added Then MessageBox.Show(i, "件目") →デバック表示です ??????? Addedならレコードの追加をしたいです End If Next End Sub ご回答よろしくお願いいたします。

  • AD0を使ってレコード総数を取得する方法は?

    22歳男性です。 VBAでADOを用いてデータベース(SQL Server)に接続してレコードを取得するプログラムを作りました。 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ dim recordset as new ADODB.Recordset dim a as integer recordset.open , , adOpenStatic a = recordset.recordcount ←← レコード総数代入 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ (少しソースを省いています。) このようにして、レコードの総数を代入するようなプログラムを作ったんですけど、このレコードの総数を取得する方法は、「recordcount」を使うしかないのでしょうか? もし上記以外の方法で、レコードの総数を取得できる方法を知っていたら教えてください。

専門家に質問してみよう