全レコードを取得できない問題の原因は?

このQ&Aのポイント
  • VB.NETでコーディング、デバッグ実行中です。区分マスタテーブルには、現在5レコードのデータがありますが、先頭から2レコードしかデータを取得してくれません。
  • oDataReader.Read()が2回目でFalseとなってWhileが終了してしまいます。
  • なぜ2回目以降にデータを取得できないのか、原因を教えてください。
回答を見る
  • ベストアンサー

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

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

  • THUBAN
  • お礼率76% (771/1002)

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

  • ベストアンサー
  • iiikkk
  • ベストアンサー率37% (92/247)
回答No.1

詳細エラーコードはなんですか? それを見れば直ぐ分かると思いますが。 とりあえず、 SELECT * FROM 区分マスタ ORDER BY 区分コード の部分を SELECT count(*) FROM 区分マスタ にしてみて、実際に5件取れているのか確認してみてはどうでしょうか。 ACCESSで確認はしているとは思いますが、駄目押しで確認してみてください。 5件となるようであれば、データを疑ってみましょう。

THUBAN
質問者

お礼

大変、すいません・・ バックアップ用のmdbを見に行っていました。 m(_"_)m バックアップ用mdbには、2レコード分のデータしか存在していなかったので。 ソースコードには問題ありませんでした。 正常データ取得も確認できました。 お騒がせいたしました。 でも、お教えいただいたチェック方法は、今後の参考になります。 ありがとうございました。

THUBAN
質問者

補足

詳細エラーコードですが、エラーは出ません。 コード自体は正常に流れていますが、  While oDataReader.Read()   'レコードが取得できた時の処理   i = i + 1   ReDim Preserve kubunInfo(i)   kubunInfo(i).kubunCode = CStr(oDataReader("区分コード"))   kubunInfo(i).syoriNaiyou = CStr(oDataReader("処理内容"))  End While の部分で、2レコード分しか回っていないのです。 アクセスデータもチェックしてみましたが、特に問題はなさそうでした。 “oDataReader.Read()”は、最終レコードに行き着くまでは、 Trueを返すはずだと理解していますが、2レコード分でFalseを 返してしまっています。 やはり、アクセスのテーブルに、どこか問題があるのでしょうか? ちなみに、Const strSelectSyain As String = "SELECT count(*) FROM 区分マスタ" として、実行してみましたが、今度は「レコード取得エラー」ウインドが出てしまいました。 (以下、ソースコードの続き) ------------------------------------ Public Function getKubunAll(ByRef kubunInfo() As structKubun) As String        ・        ・        ・        ・ '取得レコード数のチェック   If kubunInfo Is Nothing Then    'レコードがなかった時の処理    Return "区分マスタテーブルにレコードがありません"   Else    Return ""   End If   Catch oExcept As Exception    '例外が発生した時の処理   Return oExcept.ToString   Finally      'データリーダクローズ   If Not oDataReader Is Nothing Then    oDataReader.Close()   End If      'DBクローズ   If Not oConn Is Nothing Then    oConn.Close()   End If  End Try End Function

関連するQ&A

  • VB.NETで、ORACLE 8に接続するには?

    現在、ローカルのmdbに接続しています。 接続先DBを同LAN上のWin2000ServerのORACE 8に変えるべくコードを修正していますが上手くいきません。 当方、ORACLEは初めてなので、接続方法がイマイチ良くわからず・・・ ちなみに、接続方法はoo4oを用いたいです。 ご教授いただけると幸いです。 ----- mdb接続で用いているコード ------ Public Function getData(ByRef table_name As String, ByRef code_name As String, ByRef extract As String, ByRef code As String) As String  Dim oConn As New OleDbConnection    Dim oCommand As New OleDbCommand  Dim oDataReader As OleDbDataReader  Try  oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\XXXXX.mdb"  oCommand.Connection = oConn  oCommand.CommandText = "SELECT * FROM " + table_name + " ORDER BY " + code_name  oConn.Open()  oDataReader = oCommand.ExecuteReader()  While oDataReader.Read()   If code = CStr(oDataReader(code_name)) Then    getData = CStr(oDataReader(extract))    Exit While   End If  End While   ・   ・(省略)   ・  Finally  If Not oDataReader Is Nothing Then   oDataReader.Close()  End If  If Not oConn Is Nothing Then   oConn.Close()  End If  End Try End Function

  • SQL文のSELECTで読み、配列に取り込み

    SQL文のSELECTで読み、配列に取り込みたく、下記のプログラム作成しましたがエラー『ExecuteReader: Connection プロパティは初期化されていません。』が出て困っています。 どこで、どのように設定すればよいのでしょうか? Private Function Sosiki_kouzou() As String()() Dim Sosiki_tbl2(3)() As String Dim Dread As Data.OleDb.OleDbDataReader Dim Com As New Data.OleDb.OleDbCommand Com = New Data.OleDb.OleDbCommand("SELECT ORG_ID,SHORT_OU_JA, PARENT_ORG_ID FROM meldandy.WF_ORGANIZATION") Dread = Com.ExecuteReader Dim Cnt1 As Integer Cnt1 = 0 Do While (Dread.Read()) Cnt1 = Cnt1 + 1 Sosiki_tbl2(1)(Cnt1) = Dread.GetString(1) Sosiki_tbl2(2)(Cnt1) = Dread.GetString(2) Sosiki_tbl2(3)(Cnt1) = Dread.GetString(3) Loop Return Sosiki_tbl2 End Function VisualStadioを始めたばかりの素人です。 的外れかも知れませんがよろしくお願いいたします。

  • 再質問: リスト配列の添字の最大値の取得要領?

    余り、やっている全容を示すのもと思って関係個所だけを提示して質問してきました。 しかし、回答者の方にとっては煩わしい質問の仕方。 ですから、今回は、全てを晒した上で質問します。 ”列添字最大値”という記号定数を用いています。 現実のアプリケーションでは、これは良い方法だと思います。 しかし、それはそれ、これはこれです。 VB.NET の初学者の私は、<記号定数を用いない書き方>が知りたいところです。 この最終的な疑問が解消すれば、テキストの配列への呼び込み実験は終了。 宜しくお願いします。 ' ========================== ' CSVReadToArray のテスト2 ' ========================== Const 列添字最大値 As Integer = 3 Sub Main()   Dim I As Integer ' 行を参照するための For 文の変数   Dim J As Integer ' 列を参照するための For 文の変数   'Dim K As Integer ' 列(フィールドあるいは要素)の数   Dim aDatas As New List(Of String())()   Dim N = CSVReadToArray("D:\Temp\付属一覧.csv", aDatas) - 1   For I = 0 To N     For J = 0 To 列添字最大値       Debug.Print(aDatas(I)(J))     Next J   Next I End Sub ' ============================================================= ' CSV ファイルを配列に読み込む; TextFieldParser クラス版; 第2版 ' ============================================================= Function CSVReadToArray(ByVal aFile As String, _ ByRef aRows As List(Of String())) As Integer   If File.Exists(aFile) Then     Try       Using MyReader As New TextFieldParser(aFile, Encoding.Default)         MyReader.TextFieldType = FieldType.Delimited         MyReader.Delimiters = New String() {","}         While Not MyReader.EndOfData           aRows.Add(MyReader.ReadFields())         End While         Return aRows.Count       End Using     Catch ex As FileIO.MalformedLineException       MsgBox(ex.Message & "(CSVReadToArray)", , "告知:")       Return 0     End Try   Else     Return 0   End If End Function

  • DatagridviewComboboxCellについて聞きたいですが

    DatagridviewComboboxCellについて聞きたいですが、 各セルのコンボボックスに違い値を入れたいけど、以下のエラーが出ました。 "指定されたセルはグリッドにすでに属しています"。 ソース例: Dim Reader As FileReader = New FileReader("C://text.txt") Dim cbb as New DatagridviewComboboxCell() Dim cbb1 as New DatagridviewComboboxCell() Dim strA as String = "" Dim t as integer = 0 Me.Controls.Add(Dtgrdview) Dtgrdview.ColumnCount = 5 . (省略) For i as Integer = 0 to 10 Select case strA Case "A" cbb.Items.Add(Cstr(i)) Case "B" cbb1.Items.Add(Cstr(i+1)) End Select Next With Dtgrdview.Rows While not Reader.EndofData     Dim _readFile As readFile = New readFile(Reader.ReadFields()) '(readFile.vbは別) Dim row As String() = _ {_readFile.Class,_readFile.Name,_readFile.Year,_readFile.Add} ' Dtgrdview.Rows.Add(row) Select Case _readFile.ID Case "A" Dtgrdview.Rows(t).Cells(4) = cbb ==> t= 1 エラーが出る Case Else Dtgrdview.Rows(t).Cells(4) = cbb1 End Select t += 1 End While ReadFile.Close() End With 解決方法を教えてください。ありがとうございます。

  • 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は趣味でやっており、基本的質問ですが、よろしくお願いします。

  • 【vb.net】クラス化について

    大学で以下のような練習問題を頂きました。 ----- Public Sub test()  Dim a As b = New c  Dim i As Integer = 1  a.disp(i) End Sub 問:この時のbとcを実装せよ。 ----- Public Class c  Public Function disp(ByVal i As Integer) As String   return "iは" & i & "です"  End Function End Class までは書いてみたのですが、b の扱いがどうもわかりません。 どなたか教えていただけませんでしょうか。

  • 【vba】「CStr」と「Str」は同じ意味ですか?

    Sub 数値を文字型に変更() Dim i As Long Dim moji As String i = 1 moji = CStr(i) moji = Str(i) End Sub 上記のコードで得られる結果は同じです。 "1"になります。 「CStr」でも「Str」でも数値を文字列に変換しています。 ということは「CStr」でも「Str」は同じなのですか? しかしコードの表示色が 「CStr」→キーワード 「Str」→識別子 です。 これが違うと言うことは何かが違うのでしょうか?  よろしくお願いします。

  • DataTableの件数を取得したい

    DataTableの件数を取得したいのですがどのようにすれば取得できますか? Private Function getDataListCnt() As Long Dim DBConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("xxx").ConnectionString) Dim sqlCmd As New SqlCommand sqlCmd.Connection = DBConnection Dim lngRet AS Long Dim dt As DataTable = New DataTable() dt = GetList() ☆ここで取得したい☆ lngRet=??? Return lngRet End Function Private Function GetList() Dim CmdTxt As StringBuilder = New StringBuilder() CmdTxt.AppendLine(" SELECT * FROM TBL WHERE CD='001'") Dim dt = GetDBListData(CmdTxt.ToString()) Return dt End Function

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • [VB.NET] テキスト出力で困ってます(T△T

    すいません、教えて下さい。 Byte型で読み込んだ内容を指定した固定長で出力したいです。 例えば、次のテキストファイルがあります。 【読み込み元.txt】 ------------------------------------------------------- ABC123 ------------------------------------------------------- 文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。 この値を次のように出力したいです。 【出力先.txt】(3バイト区切りとする) ------------------------------------------------------- 414243 313233 ------------------------------------------------------- なんとか自力で近しい?とこまで行けたのかなと思いますが 肝心の出力がうまくいきません。 【VB.Net】 ------------------------------------------------------- Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\A.txt" ' 読み込み元 Dim detName As String = "C:\Temp\B.txt" ' 出力先 ' 処理開始 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(destName, FileMode.Create, FileAccess.Write) While True ' 読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 直接16進数を指定固定長で書き込みしたい部分 For i As Integer = 0 To readSize - 1 msgbox buf(i) Next ' 書き込み実行 dest.Write(buf, 0, readSize) End While End Using End Using ------------------------------------------------------- 大変お手数ですがご教示頂ければと思います。

専門家に質問してみよう