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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

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

Visual Studio

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

VB.NET

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

Q&A

解決済

3回答

8830閲覧

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

kumakumatan

総合スコア213

Oracle

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

Visual Studio

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

VB.NET

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

0グッド

0クリップ

投稿2018/06/11 06:54

OS:Windows7Sp1
VisualStudio2017community
言語:VisualBasic.NET

vb

1Imports System 2Imports System.Data 3Imports Oracle.DataAccess.Client 4Public Class Form1 5 6 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 7 8 Dim strUser As String 'ユーザー 9 Dim strPasswd As String 'パスワード 10 Dim strDataSource As String 'データソース 11 Dim strConnectstring As String 12 Dim oraCon As OracleConnection 13 14 strUser = "tst" 15 strPasswd = "tst" 16 strDataSource = "TST010" 17 strConnectstring = "User Id=" & strUser & "; " & "Password=" & strPasswd & "; " & "Data Source=" & strDataSource 18 oraCon = New OracleConnection(strConnectstring) 19 20 Try 21 oraCon.Open() 22 Console.WriteLine("Connection to Oracle database established successfully !") 23 MsgBox("Connection to Oracle database established successfully !") 24 Console.WriteLine(" ") 25 26 '(1)は正常(2)は「指定されたキャストは有効ではありません」と表示される 27 28 'Dim cmdQuery As String = "SELECT CD, NM FROM TST.TS_FLG" '(1) 29 'Dim cmdQuery As String = "SELECT ID, FLG FROM TST.TK_WORK"'(2) 30 31 ' Create the OracleCommand object 32 Dim cmd As OracleCommand = New OracleCommand(cmdQuery) 33 cmd.Connection = oraCon 34 cmd.CommandType = CommandType.Text 35 36 Dim reader As OracleDataReader = cmd.ExecuteReader() 37 While (reader.Read()) 38 39 ' Output Employee Name and Number 40 MsgBox("reader.GetDecimal(0) & 41 " , " & 42 reader.GetString(1)) 43 44 End While 45 46 Catch ex As Exception 47 MsgBox(ex.Message) 48 49 Finally 50 ' Close and Dispose OracleConnection object 51 oraCon.Close() 52 oraCon.Dispose() 53 End Try 54 55 End Sub 56End 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が正常に実施されました。

宜しくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

VB.NET

1MsgBox("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 07:14

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2018/06/11 07:16

ご回答ありがとうございます。 reader.GetString→NVARCHAR2 reader.GetDecimal→NUMBER としたら正常にselectが実施できました!
guest

0

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で取得できるはずもなし。

投稿2018/06/11 07:12

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/06/11 07:10

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2018/06/11 07:14

ご回答ありがとうございます。 reader.GetString→NVARCHAR2 reader.GetDecimal→NUMBER という事でしょうか? 指定し直したら正常にselectが実施できました。
YAmaGNZ

2018/06/11 07:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問