質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Visual Studio

    1699questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • VB.NET

    873questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • Oracle

    571questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

VB.NETにてSELECT発行時、「指定されたキャストは有効ではありません」と表示される

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 168

kumakumatan

score 121

OS:Windows7Sp1
VisualStudio2017community
言語:VisualBasic.NET

Imports System
Imports System.Data
Imports Oracle.DataAccess.Client
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim strUser As String 'ユーザー
        Dim strPasswd As String 'パスワード
        Dim strDataSource As String 'データソース
        Dim strConnectstring As String
        Dim oraCon As OracleConnection

        strUser = "tst"
        strPasswd = "tst"
        strDataSource = "TST010"
        strConnectstring = "User Id=" & strUser & "; " & "Password=" & strPasswd & "; " & "Data Source=" & strDataSource
        oraCon = New OracleConnection(strConnectstring)

        Try
            oraCon.Open()
            Console.WriteLine("Connection to Oracle database established successfully !")
            MsgBox("Connection to Oracle database established successfully !")
            Console.WriteLine(" ")

            '(1)は正常(2)は「指定されたキャストは有効ではありません」と表示される

            'Dim cmdQuery As String = "SELECT CD, NM FROM TST.TS_FLG" '(1)
            'Dim cmdQuery As String = "SELECT ID, FLG FROM TST.TK_WORK"'(2)

            ' Create the OracleCommand object
            Dim cmd As OracleCommand = New OracleCommand(cmdQuery)
            cmd.Connection = oraCon
            cmd.CommandType = CommandType.Text

            Dim reader As OracleDataReader = cmd.ExecuteReader()
            While (reader.Read())

                ' Output Employee Name and Number
                MsgBox("reader.GetDecimal(0) &
                                                 " , " &
               reader.GetString(1))

            End While

        Catch ex As Exception
            MsgBox(ex.Message)

        Finally
            ' Close and Dispose OracleConnection object
            oraCon.Close()
            oraCon.Dispose()
        End Try

    End Sub
End Class


(1)の場合Selectが実施できるのですが、(2)の場合
「指定されたキャストは有効ではありません」と「MsgBox(ex.Message)」
に表示されてしまいます。

(1)のカラム情報、TST.TS_FLGテーブル
CD:NUMBER(1,0) NOT NULL
NM:NVARCHAR2(20)

(2)のカラム情報、TST.TK_WORKテーブル
ID:VARCHAR2(12) NOT NULL
FLG:NUMBER(1,0) DEFAULT 0

(1)は正常なのですが(2)にて「指定されたキャストは有効ではありません」
と表示されるのは何故でしょうか?
また、どうすれば(2)の処理は正常になりますでしょうか?

(1)と(2)はsqlplusでは両方ともselectが正常に実施されました。

宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

MsgBox("reader.GetDecimal(0) & " , " & reader.GetString(1))


上記ではカラムの1番目をDecimalで2番目を文字列として取得するように記述されています。

(1)のカラム情報、TST.TS_FLGテーブル
CD:NUMBER(1,0) NOT NULL
NM:NVARCHAR2(20)

上記では属性があっていますが、

(2)のカラム情報、TST.TK_WORKテーブル
ID:VARCHAR2(12) NOT NULL
FLG:NUMBER(1,0) DEFAULT 0

こちらでは合っていないのでエラーになっています。

select しようとしている内容の属性に合わせて取得する必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/11 16:16

    ご回答ありがとうございます。
    reader.GetString→NVARCHAR2
    reader.GetDecimal→NUMBER

    としたら正常にselectが実施できました!

    キャンセル

+2

ソースのどこでエラーが発生しているか確認しましたか?

OracleDataReader.GetDecimalメソッド (Int32)
OracleDataReader.GetStringメソッド (Int32)
こちらと、そのテーブルの取得しているカラムの型を考えれば分かるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/11 16:14

    ご回答ありがとうございます。

    reader.GetString→NVARCHAR2
    reader.GetDecimal→NUMBER
    という事でしょうか?
    指定し直したら正常にselectが実施できました。

    キャンセル

  • 2018/06/11 16:24

    変数やデータベースの列など、常に型を意識してください。
    文字(文字列)→数値
    数値→文字(文字列)
    など、VB.NETでは暗黙で型変換してくれることが多いのですが
    暗黙な型変換に頼るべきではありません。
    Option strictをONにしてコーディングしましょう。

    キャンセル

+2

Dim cmdQuery As String = "SELECT ID, FLG FROM TST.TK_WORK"'(2)

(2)のカラム情報、TST.TK_WORKテーブル
ID:VARCHAR2(12) NOT NULL
FLG:NUMBER(1,0) DEFAULT 0 

IDがVARCHAR2(文字列)、FLGがNUMBER(数値)なのだから、

' Output Employee Name and Number
MsgBox("reader.GetDecimal(0) & " , " & reader.GetString(1))

文字列をGetDecimalで取得できるはずもなし、数値をGetStringで取得できるはずもなし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Visual Studio

    1699questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • VB.NET

    873questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • Oracle

    571questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。