none
ExecuteScalarについて RRS feed

  • 質問

  • おはようございます。

     

    以下のようなコードがあり、

     

            Dim dr As MySqlDataReader
            Dim i As Integer
            Dim Cmd As New MySqlCommand
            Dim Cmd_Count As New MySqlCommand
            Dim DataCnt As Integer

            If Microsoft.VisualBasic.IsDBNull(Me.txt_StockCode.Text) Or Me.txt_StockCode.Text = "" Then
                If MsgBox("全銘柄のデータを取得しますか", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
                    Call MySQL_Open()

                    With Cmd
                        .Connection = Cn
                        .CommandText = "s_s_codelist"
                        .CommandType = CommandType.StoredProcedure
                    End With

                    dr = Cmd.ExecuteReader

                    '指定銘柄のデータ件数が100件未満の場合は、データを取得
                    While dr.Read
                        Cmd_Count.Parameters.Clear()

                        With Cmd_Count
                            .Connection = Cn
                            .CommandText = "s_s_datacount"
                            .CommandType = CommandType.StoredProcedure
                            .Parameters.Add(New MySqlParameter("code", dr("mg_code")))
                        End With

                        'データ件数を変数に格納
                        DataCnt = CInt(Cmd_Count.ExecuteScalar)               ← ここ

                        If DataCnt < 100 Then
                            Call Get_DailyOldData(dr("mg_code"))

                            '完了のテキストを表示
                            Me.txt_Coment.Text = dr("mg_name") & "取得完了しました。"

                            'パラメータをクリア
                            Cmd_Count.Parameters.Clear()
                        End If

                        'パラメータをクリア
                        Cmd_Count.Parameters.Clear()
                    End While
                Else
                    MsgBox("中止しました。", MsgBoxStyle.Critical)
                    Me.txt_StockCode.Select()
                    Exit Sub
                End If
            Else
                Call Get_DailyOldData(Me.txt_StockCode.Text)
            End If
            If dr IsNot Nothing Then
                dr.Close() : dr = Nothing
            End If

     

    矢印の部分で以下のエラーが出ます。

    There is already an open DataReader associated with this Connection which must be closed first.

     

    いろいろと調べてはいるのですが、なぜこのようなエラーが出るのかわかりません。

     

    どうか、アドバイスをお願いいたします。

     

    2008年7月30日 19:05

回答

すべての返信

  • TI-cb400sさん こんにちは

     

    ← ここ と書かれている上の部分でdr = Cmd.ExecuteReaderにより取得したMySqlDataReaderをClose(ここではdr.Close())させればエラーがでなくなるのではと思います。

    2008年7月30日 23:32
  • SQL Server 2005でしょうか? であれば、MARSが使えます。

     

    (参考)

    10 行でズバリ !! Multiple Active Result Sets の利用 (VB)
    http://www.microsoft.com/japan/msdn/thisweek/300x10/Phase3/MARS/vb.aspx

    2008年7月31日 1:22
    モデレータ
  •  TI-cb400s さんからの引用

    矢印の部分で以下のエラーが出ます。

    There is already an open DataReader associated with this Connection which must be closed first.

     

    いろいろと調べてはいるのですが、なぜこのようなエラーが出るのかわかりません。

     

    例外のメッセージで丁寧にやるべきことが指示されていますが、何をいろいろと調べられたのでしょうか?
    翻訳サイト -> http://www.excite.co.jp/world/english/ とか AltaVista などがお勧めです。

    2008年7月31日 2:53
  • ご回答ありがとうございます。

     

    質問の後も調べていたのですが、DataReaderはひとつのConnection内で一つしか開くことが出来ないのですね。

     

    DBから取得した内容をDataTableにいれて、それをループして対処したいと思います。

     

    もっともっと勉強していきたいと思います。

    皆様、アドバイスありがとうございました。

    2008年7月31日 13:04
  •  TI-cb400s さんからの引用

    質問の後も調べていたのですが、DataReaderはひとつのConnection内で一つしか開くことが出来ないのですね。

     

    念のために補足しておきます。SQL Server 2000まではその通りなのですが、SQL Server 2005ではMARSにより、ひとつのConnection内で複数のDataReaderが開けます。

    2008年7月31日 14:00
    モデレータ
  • ご回答ありがとうございます。

     

    お伝えするのを忘れていたのですが、今回、DBはMySQLを利用しております。

     

    SQLServerも利用しますので、trapemiyaさんに教えていただいた方法も、テストしてみたいと思います。

    本当にありがとうございます。

     

    2008年7月31日 22:34