- PR -

DBからの値の取得

1
投稿者投稿内容
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-11-22 16:03
失礼します。
VB.NETで開発を始めたばかりの初心者で本を片手に開発しているのですが、エラーが出てどうしてもわかりません。どなたかご教授ください。

下のプログラムでOracleから日付を取得したいのですが、
オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
というエラーがでます。エラーが出るところで一度止めてから走らせると正しく処理してくれるのですが・・・どうすればこのエラーを回避できますか?よろしくおねがいします。

Public Shared Function GetDBSysdate(ByRef connection As OracleConnection, ByRef strFormat As String) As String
Dim sysdateToday As Date
Dim command As OracleCommand = New OracleCommand("SELECT SYSDATE FROM DUAL", connection)
connection.Open()
Dim reader As OracleDataReader = command.ExecuteReader

sysdateToday = CType(reader("SYSDATE"), Date)  'エラー

reader.Close()
connection.Close()

If strFormat <> "" Then
GetDBSysdate = Format(sysdateToday, strFormat)
Else
GetDBSysdate = CType(sysdateToday, String)
End If
End Function
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-22 16:33
私は以下のように、ExecuteScalar メソッドを使います。

コード:

    Public Shared Function GetServerDate() As System.DateTime
        Dim hConnection As System.Data.OracleClient.OracleConnection

        Try
            hConnection = New System.Data.OracleClient.OracleConnection("...")
            Dim hCommand As System.Data.OracleClient.OracleCommand

            Try
                hCommand = New System.Data.OracleClient.OracleCommand("SELECT SYSDATE FROM DUAL", hConnection)
                hConnection.Open()

                Try
                    Return DateTime.Parse(hCommand.ExecuteScalar().ToString())
                Catch exOracle As System.Data.OracleClient.OracleException
                    Throw exOracle
                Finally
                    If Not hConnection Is Nothing Then
                        hConnection.Close()
                    End If
                End Try
            Finally
                If Not hCommand Is Nothing Then
                    hCommand.Dispose()
                End If
            End Try
        Finally
            If Not hConnection Is Nothing Then
                hConnection.Dispose()
            End If
        End Try
    End Function


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-11-22 17:56
ありがとうございます!
ExecuteScalar メソッドを使うとエラーが出なくなりました。

この場合ExecuteReaderは駄目だったのでしょうか?
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-22 18:28
Readしていない。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-22 19:00
引用:

たつさんの書き込み (2005-11-22 17:56) より:

この場合ExecuteReaderは駄目だったのでしょうか?


todo さんの仰る通り Read メソッドを事前に呼び出していないためです。
ExecuteReader バージョンを書きます。

コード:

    Public Shared Function GetServerDate() As System.DateTime
        Dim hConnection As System.Data.OracleClient.OracleConnection

        Try
            hConnection = New System.Data.OracleClient.OracleConnection("...")
            Dim hCommand As System.Data.OracleClient.OracleCommand

            Try
                hCommand = New System.Data.OracleClient.OracleCommand("SELECT SYSDATE FROM DUAL", hConnection)
                hConnection.Open()

                Try
                    Dim hReader As System.Data.OracleClient.OracleDataReader

                    Try
                        hReader = hCommand.ExecuteReader()

                        If hReader.Read() Then
                            Return DateTime.Parse(hReader("SYSDATE").ToString())
                        End If
                    Finally
                        If Not hReader Is Nothing Then
                            Try
                                hReader.Close()
                            Finally
                                hReader.Dispose()
                            End Try
                        End If        
                    End Try
                Finally
                    If Not hConnection Is Nothing Then
                        hConnection.Close()
                    End If
                End Try
            Finally
                If Not hCommand Is Nothing Then
                    hCommand.Dispose()
                End If
            End Try
        Finally
            If Not hConnection Is Nothing Then
                hConnection.Dispose()
            End If
        End Try
    End Function


今回は 1 データのみの取得ですので、ExecuteScalar メソッドの方が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-22 22:32
コードはじゃんぬさんとかぶるので、書くときの注意。


 VB では関数名の変数を暗黙で用意してくれますが、他の言語の人にとってわかりにくいことこの上ありません。戻り値用の変数を用意しましょう。

 リファレンスを調べ、IDispose インターフェイスを実装しているか、確認します。実装しているクラスのインスタンスは、使い終わったら必ず Dispose します。このように、Try 〜 Finally で囲み、Finally ブロックで Dispose します。

 文字列への変換は、独自にフォーマット関数を作るのではなく、String.Format や ToString メソッドを利用します。

 データベースからいきなり get すると、null 値の場合に例外が生成されます。IsDBNull で検査して、場合分けをします。

 空文字列の検査は、Length で検査するか、String.Empty と比較します。"" だと、ここにオブジェクトが生成されます。
___________________________________________________________________
□ written by Jitta on 2005/11/22
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-11-24 12:26
todoさん、じゃんぬねっとさん、Jittaさんありがとうございます!
大変勉強になりました。
もっと勉強しますが、分からない所が出てきたらまたよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)