前提・実現したいこと
VB.NETでOleDbCommandクラスを使用するSELECT分を実行時に”指定されたキャストは有効ではありません”のエラーになります。
発生している問題・エラーメッセージ
指定されたキャストは有効ではありません
該当のソースコード
Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim prov As String = "****" Dim serverName As String = "*****" Dim dataBase As String = "******" Dim userid As String = "****" Dim pwd As String = "" Dim dread As OleDb.OleDbDataReader Dim str As String = String.Empty Try Using conn As New OleDb.OleDbConnection() conn.ConnectionString = " Provider = " & prov & ";Data Source = " & serverName & ";Initial Catalog = " & dataBase & ";User ID = " & userid & ";Password =" & pwd conn.Open() Using cmd As New OleDb.OleDbCommand() cmd.Connection = conn cmd.CommandText = "SELECT * " & ControlChars.NewLine & "FROM [dbo].**** " & ControlChars.NewLine & "WHERE ****** BETWEEN ? AND ? " & ControlChars.NewLine & "ORDER BY ******* " & ControlChars.NewLine cmd.Parameters.Add("@CYUUMON_BANGOU_St", OleDb.OleDbType.Integer).Value = ***** cmd.Parameters.Add("@CYUUMON_BANGOU_End", OleDb.OleDbType.Integer).Value = ****** dread = cmd.ExecuteReader() Do While dread.Read() Dim iIdx1 As Integer, iIdx2 As Integer iIdx1 = dread.GetOrdinal("******") iIdx2 = dread.GetOrdinal("******") str &= "CYUUMON_BANGOU:" & dread.GetInt32(iIdx1) & Space(6) & "SEIZOU_LINE_NO:" & dread.GetString(iIdx2) & ControlChars.NewLine Loop End Using Label1.Text = str End Using Catch ex As Exception Label1.Text = Err.Description End Try End Sub End Class
試したこと
接続は正常に出来ているのを確認しています。
補足情報(FW/ツールのバージョンなど)
Visual studio 2019
とりあえず、どの行でエラーが起きているか確認してください。
[チュートリアル: Visual Studio を使用した Visual Basic コードのデバッグについて理解する]
https://docs.microsoft.com/ja-jp/visualstudio/get-started/visual-basic/tutorial-debugger?toc=%2Fvisualstudio%2Fdebugger%2Ftoc.json&view=vs-2022
> Label1.Text = Err.Description
Errオブジェクトからエラー情報を取得するのは古いやり方なのでやめましょう。詳細なエラー情報を取得するなら、Exceptionオブジェクトから取得してください。
Label1.Text = ex.ToString() の方が良いでしょう。
エラーの詳細が判ったら、質問を編集して追記してください。
ありがとうございました。
str &= "CYUUMON_BANGOU:" & dread.GetInt32(iIdx1) & Space(6) &
⇒データ型と変数の型式の指定が問題でした。
str &= "CYUUMON_BANGOU:" &dread.GetString(iIdx1) & Space(6) &
としたところ正常に動作はしましたが、逆にSQLでnumeric(4.0)のデータを抽出しようとした場合エラーが出ました。
データ型のエラーを解消したい場合どのような情報を探せばよろしいでしょうか。
GetValue メソッドで object 型として取得し中身を確認してください
みたところ DB は SQL Server ですよね?
Imports System.Data.SqlClient としているのに、OleDB を使っているのは何故なんでしょう?
> データ型のエラーを解消したい場合どのような情報を探せばよろしいでしょうか。
だから最初にエラーの詳細を聞いているのですが。指摘した事くらいはやってください。
大抵は、エラーコードやエラーメッセージの一部でググれば情報は出てきますけど。
あなたの回答
tips
プレビュー