none
エラーメッセージ表示 RRS feed

  • 質問

  • 「型system.object[]'のオブジェクト型 system.string[]'にキャストできません」と表示されますが、何のことが、

    意味がわかりません。VB初心者で申し訳ないのですが、説明お願いします。

    2011年2月17日 0:58

回答

  • >その関数をcallしてるのですが、callする時にエラーが表示されます。

    エラーはデバッグ実行でステップインして確認していますか?

    rc = Open_RS_Upd(Cnn, TBLName, CNDstr, COLnam, COLval, COLtyp, COLpro)

    の箇所でブレークポイントを貼って、プログラムをデバッグモードで実行して

    ブレークポイントでとまったら、ステップイン実行(そのメソッドの中に入る)でどこでエラーが

    発生しているのかを確認してください。

    ステップイン実行に割り当てられたキーは、メニュー「デバッグ」の「ステップイン」で確認できます。

    • 回答としてマーク 京太郎 2011年2月17日 3:02
    2011年2月17日 2:46

すべての返信

  • キャストのエラーだとは思うのですが、どういった処理を行っているのか不明です。

    キャストとは、変数などのデータ型を、別のデータ型に変換することです。

    具体的にどこが原因かを知りたいのでしたら、最低限エラーが再現するコードを

    ご提示していただいたほうがよいかと思います。

    2011年2月17日 1:32
  • object型から全てのクラスが派生しています。string型も例外ではありません。基底クラス(継承元のクラス)より派生したクラスは、基底クラスの内容を含みますから、基底クラスより機能が豊富になります。したがって、object型をより機能の豊富なstring型に型変換(これをキャストと言います)するには、object型にはなくstring型にしかない部分が問題になります。このような継承元から継承先(派生先)へのキャストをダウンキャストと言います。コンパイルは通りますが、実行時にエラーになります。

    #わかりやすく説明できていないかもしれませんので、わかりにくければまた質問して下さい。とりあえずダウンキャストについて調べられると良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年2月17日 1:35
    モデレータ
  • Public Function Open_RS_Upd(ByRef cn As ADODB.Connection, ByRef TBLName As String, ByRef CNDstr As String, ByRef COLnam() As String, ByRef COLval() As String, ByRef COLtyp() As String, ByRef COLpro() As String) As Boolean
            On Error GoTo ErrorHandle

            '----- 変数宣言 -----
            Dim RS As ADODB.Recordset
            Dim i As Integer
            Dim COLlist As String = Nothing
            Dim OriginData As Integer
            Dim RepCOLnam As String

            '----- 初期化 -----
            Open_RS_Upd = True

            For i = 0 To MAXCOL - 1
                If COLnam(i) = Nothing Then
                    Exit For
                End If
                If i = 0 Then
                    COLlist = Space(1) & COLnam(i)
                Else
                    COLlist = COLlist & "," & COLnam(i)
                End If
            Next

            RS = New ADODB.Recordset
            RS.ActiveConnection = cn
            RS.CursorLocation = ADODB.CursorLocationEnum.adUseClient
            RS.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
            RS.LockType = ADODB.LockTypeEnum.adLockPessimistic

            SQL = "select " & COLlist & " from " & TBLName & " with(UPDLOCK) " & "where " & CNDstr

            Clipboard.Clear()
            Clipboard.SetText(SQL)

            RS.Open(SQL)
            If RS.EOF Then
                Open_RS_Upd = NOREC                                                     '存在しない
                RS.Close() : RS = Nothing
                Exit Function
            Else
                Do While Not RS.EOF
                    '----- 項目の設定 -----
                    For i = 0 To MAXCOL - 1
                        If COLnam(i) = Nothing Then
                            Exit For
                        End If

                        '----- Pre-fix の COLval の処理 -----
                        If UCase(Strings.Left(COLval(i), 4)) = "FROM" Then
                            RepCOLnam = Mid(COLval(i), 5, 20)
                            COLval(i) = RS(RepCOLnam).Value                             '置換カラムの値より、COLval(i)をリセット
                        End If

                        '----- 現在値の取込み -----
                        If COLtyp(i) = "N" Then                                         '<数値型>
                            OriginData = Val(RS(COLnam(i)))
                            If COLpro(i) = "+" Then                                     '加算
                                COLval(i) = Format(OriginData + Val(COLval(i)))
                            ElseIf COLpro(i) = "-" Then                                 '減算
                                COLval(i) = Format(OriginData - Val(COLval(i)))
                            ElseIf COLpro(i) = "R" Then                                 '置換
                            ElseIf COLpro(i) = "X" Then                                 'NOP
                            End If
                        Else                                                            '<文字列>
                        End If

                        '----- 更新値のセット -----
                        If COLval(i) <> "X" Then
                            RS(COLnam(i)).Value = COLval(i)
                        End If
                    Next
                    RS.Update()                                                         'レコードの更新
                    RS.MoveNext()                                                       '次のデータ
                Loop
            End If

            '----- テーブル解放 -----
            RS.Close() : RS = Nothing

            Exit Function
    ErrorHandle:
            Dim ErrLoop As ADODB.Error
            Dim ErrNum

            '----- Error Object の最初の Error Number を取り出す -----
            For Each ErrLoop In Cnn.Errors
                ErrNum = ErrLoop.Number
                Exit For
            Next
            If CLng(ErrNum) = TIMEOUT Then
                Open_RS_Upd = TIMEOUT
            Else
                Open_RS_Upd = False
            End If
            cn.Errors.Clear()
        End Function

    を作成して、その関数をcallしてるのですが、callする時にエラーが表示されます。

    呼び出してるところは下記のところです。(rc:戻り値)

    rc = Open_RS_Upd(Cnn, TBLName, CNDstr, COLnam, COLval, COLtyp, COLpro)

    下記は定義の一部です。

     Public TBLName As String                            'テーブル名
        Public CNDstr As String                             'WHERE句の内容
        Public COLdmy As String                             'ダミーカラム名(削除の時使用、どのカラムでも可)
        Public COLnam(MAXCOL) As String                     'カラム名リスト
        Public COLval(MAXCOL) As String                     'カラム値リスト
        Public COLtyp(MAXCOL) As String                     'データ型(N 数値型 A or "" 文字型)[変更モード]のみ使用
        Public COLpro(MAXCOL) As String                     '演算タイプ(+:加算,-:減算,R:置換,X:処理なし)[変更モード]のみ使用

    2011年2月17日 1:46
  • >その関数をcallしてるのですが、callする時にエラーが表示されます。

    エラーはデバッグ実行でステップインして確認していますか?

    rc = Open_RS_Upd(Cnn, TBLName, CNDstr, COLnam, COLval, COLtyp, COLpro)

    の箇所でブレークポイントを貼って、プログラムをデバッグモードで実行して

    ブレークポイントでとまったら、ステップイン実行(そのメソッドの中に入る)でどこでエラーが

    発生しているのかを確認してください。

    ステップイン実行に割り当てられたキーは、メニュー「デバッグ」の「ステップイン」で確認できます。

    • 回答としてマーク 京太郎 2011年2月17日 3:02
    2011年2月17日 2:46