none
EXCELファイルのデータベースからSELECTするとエラー RRS feed

  • 質問

  • VisualBasic2010にてExcel2000のファイルをデータベースとして

    下記コードにてselectをしてメッセージボックスに表示する際に「引数 'Prompt' は型 'String' に変換できません。」

    というエラーが発生してしまいます。

    すべてのレコードで発生するわけではないのでEXECELデータ側に問題があるのでしょうか?

    ご教授宜しくお願いいたします。

    [コード]

    Using oracleConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & _
                                                                   "Data Source=C:\Master.xls;Extended Properties=Excel 8.0")
                    Dim OracleCommand As New OleDbCommand( _
                    "SELECT " & _
                    "列1,列2,列3,列4,列5,列6,列7 " & _
                    "FROM [Master$] " & _
                    "WHERE 列1='A' ", oracleConn)

                    Dim adapter As New OleDbDataAdapter(OracleCommand)
                    oracleConn.Open()

                    Dim ds As New DataSet
                    adapter.Fill(ds)

                    MsgBox(ds.Tables(0).Rows(0)(0), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(1), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(2), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(3), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(4), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(5), MsgBoxStyle.Information, "")
                    MsgBox(ds.Tables(0).Rows(0)(6), MsgBoxStyle.Information, "")     ←ここでエラーが発生します。

    End Using

    2013年6月27日 22:36

回答

  • Dim OracleCommand As New OleDbCommand( _

    「OracleCommand」という変数名だと、OracleDbCommand クラスを連想してしまいます。OleDbCommand クラスの変数名とするには、ふさわしくないような…。

    ←ここでエラーが発生します。

    データが Null になっているのでしょう。下記のようなコードを書くと

    MsgBox(0)               'OK
    MsgBox("")              'OK
    MsgBox(Nothing)         'OK
    MsgBox(DBNull.Value)    '引数 'Prompt' は型 'String' に変換できません。

    という動作となります。そのため、あらかじめNullかどうかを判定するコードを付与するか

    If IsDBNull(ds.Tables(0).Rows(0)(6)) Then
        MsgBox("(nullです)")
    Else
        MsgBox(ds.Tables(0).Rows(0)(6))
    End If
    

    あるいは空文字列として表示するための対処が必要となります。

    MsgBox(String.Format("{0}", ds.Tables(0).Rows(0)(6)))
    MsgBox(ds.Tables(0).Rows(0)(6) & "")

    なお、データが含まれているにもかかわらず Null が返されるようであれば、データ型が誤って判定されている可能性があります。

    Excel 内のデータはテキストなのに、ds.Tables(0).Columns(6).DataType.Name が数値型(Doubleなど)として判断されている場合には、Import Mode を指定してみてください。具体的には、接続文字列を
    New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; (中略); Extended Properties=Excel 8.0")
    から
    New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; (中略); Extended Properties=""Excel 8.0;IMEX=1;HDR=YES""")
    に変更します(HDR=YES/NOは任意です)。この場合、文字列データを含む列がテキスト列として扱われるようになります。

    • 回答としてマーク JJ-unicorn 2013年6月28日 4:49
    2013年6月28日 2:21

すべての返信

  • そこまで当たりがついているのであれば、Debug実行で ds.Tables(0).Rows(0) の内容確認をお勧めします。

    「MsgBox(ds.Tables(0).Rows(0)(6), MsgBoxStyle.Information, "")     ←ここでエラーが発生します。」

    の部分をTry ~ Catchで囲うなどして、エラーが出る際の列インデックス6の値をご確認下さい。

    2013年6月28日 0:16
  • Dim OracleCommand As New OleDbCommand( _

    「OracleCommand」という変数名だと、OracleDbCommand クラスを連想してしまいます。OleDbCommand クラスの変数名とするには、ふさわしくないような…。

    ←ここでエラーが発生します。

    データが Null になっているのでしょう。下記のようなコードを書くと

    MsgBox(0)               'OK
    MsgBox("")              'OK
    MsgBox(Nothing)         'OK
    MsgBox(DBNull.Value)    '引数 'Prompt' は型 'String' に変換できません。

    という動作となります。そのため、あらかじめNullかどうかを判定するコードを付与するか

    If IsDBNull(ds.Tables(0).Rows(0)(6)) Then
        MsgBox("(nullです)")
    Else
        MsgBox(ds.Tables(0).Rows(0)(6))
    End If
    

    あるいは空文字列として表示するための対処が必要となります。

    MsgBox(String.Format("{0}", ds.Tables(0).Rows(0)(6)))
    MsgBox(ds.Tables(0).Rows(0)(6) & "")

    なお、データが含まれているにもかかわらず Null が返されるようであれば、データ型が誤って判定されている可能性があります。

    Excel 内のデータはテキストなのに、ds.Tables(0).Columns(6).DataType.Name が数値型(Doubleなど)として判断されている場合には、Import Mode を指定してみてください。具体的には、接続文字列を
    New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; (中略); Extended Properties=Excel 8.0")
    から
    New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; (中略); Extended Properties=""Excel 8.0;IMEX=1;HDR=YES""")
    に変更します(HDR=YES/NOは任意です)。この場合、文字列データを含む列がテキスト列として扱われるようになります。

    • 回答としてマーク JJ-unicorn 2013年6月28日 4:49
    2013年6月28日 2:21
  • 今回の質問はExcelとのことなので無関係かもしれませんが、でも変数名OracleCommandは少し気になります。

    Oracleデータベースの場合、空文字列は NULL と扱われるという話を聞いたことがあります。その場合、.NET側ではDBNullになり、魔界の仮面弁士さんの説明のように「引数 'Prompt' は型 'String' に変換できません。」エラーになるかもしれません。
    # 伝聞で私自身はOracleを扱ったことはありません。

    2013年6月28日 2:31
  • 説明不足で申し訳ありません。

    データは入っているがデータ型が誤って判定されてNullが返されるという状況でした。

    ご教授いただいたとおりにImportModeを指定すると正しく文字列型としてデータが返ってくるようになりました。

    ありがとうございました。

    2013年6月28日 4:54