tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルIOraField' から型 'String' へのキャストが有効ではありません。
記事No1466
投稿日: 2005/03/15(Tue) 11:30
投稿者はせどん
[OSのVer]:Windows XP    [VBのVer]:VB.NET   2003
[DBARABASE]:Oracle10g

VB6+oo4oをVB.NETに移行しています。

IOraField' から型 'String' へのキャストが有効ではありません。

Public P_ORA As OracleInProcServer.OraDynaset
P_ORA = GT_ORA.DB.CreateDynaset(SQL文, ora_mode)
sSS$ = P_ORA.Fields("USER_ID") ← カラム名を直指定して値取得のイメージ
上記のような形で値を取得していました。

VB6では勝手に型変換してくれたのですが、.NETではエラーになります。
どのように対応していますでしょうか?

[ツリー表示へ]
タイトルRe: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1467
投稿日: 2005/03/15(Tue) 11:46
投稿者gtk
P_ORA.Fields("USER_ID").ToString()
でいけないかな?試してないけど

[ツリー表示へ]
タイトルRe^2: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1468
投稿日: 2005/03/15(Tue) 11:53
投稿者はせどん
[OSのVer]:Windows    [VBのVer]:VB.NET  
> P_ORA.Fields("USER_ID").ToString()
> でいけないかな?試してないけど

P_ORA.Fields("USER_ID").ToString()はできませんが、
P_ORA.Fields("USER_ID").GetType.ToStringはできます。
しかし、取得できる値は、"System.__ComObject"となるようです。。。

[ツリー表示へ]
タイトルRe: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1471
投稿日: 2005/03/15(Tue) 15:55
投稿者はせどん
みなさまありがとうございます。

P_ORA.Fields("USER_ID").GetTypeのみしかコーディングエディタで指定
できなかったので、固定観念がありました。
sSS = CStr(P_ORA.Fields("USER_ID").value)
valueで値を取得できました。

なぜ、コーディングデディタで.valueが表示されないのか分かりませんが。。。
P_ORA.Fields("USER_ID").value ← の型は何型なのでしょうか?









[OSのVer]:Windows    [VBのVer]:VB.NET  
> [OSのVer]:Windows XP    [VBのVer]:VB.NET   2003
> [DBARABASE]:Oracle10g
>
> VB6+oo4oをVB.NETに移行しています。
>
> IOraField' から型 'String' へのキャストが有効ではありません。
>
> Public P_ORA As OracleInProcServer.OraDynaset
> P_ORA = GT_ORA.DB.CreateDynaset(SQL文, ora_mode)
> sSS$ = P_ORA.Fields("USER_ID") ← カラム名を直指定して値取得のイメージ
> 上記のような形で値を取得していました。
>
> VB6では勝手に型変換してくれたのですが、.NETではエラーになります。
> どのように対応していますでしょうか?

[ツリー表示へ]
タイトルRe^2: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1474
投稿日: 2005/03/15(Tue) 16:15
投稿者魔界の仮面弁士
> sSS = CStr(P_ORA.Fields("USER_ID").value)
> valueで値を取得できました。

その記述だと、ActiveXオブジェクトが正常に解放されない可能性がありますよ。
hhttp://support.microsoft.com/default.aspx?scid=kb;ja;317109

ReleaseComObject メソッドを呼ぶために、それぞれのCOMオブジェクトを
変数にキャッシュしておくようにしてください。


> なぜ、コーディングデディタで.valueが表示されないのか分かりませんが。。。
それは、VB6の場合も同様ですよね。

> P_ORA.Fields("USER_ID").value ← の型は何型なのでしょうか?
汎用のObject型ですから、メンバが入力補完される事はありません。

そもそも、上記が
  P_ORA.Fields.Item("USER_ID").Value
の省略形だという事は理解されていますか?
(Itemプロパティは、引数を持った Default Property なので、省略可能です)


P_ORA.Fields は、OraFields 型のオブジェクトを返します。
ただし、タイプライブラリ上では、As Object です。

OraFields型のItemプロパティは、OraField型のオブジェクトを返します。
ただし、タイプライブラリ上では、As Object です。

OraField型のValueプロパティは、COMでいうところのVariant型を返します。
.NETにおいては、これは As Object として処理されます。

[ツリー表示へ]
タイトルRe: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1472
投稿日: 2005/03/15(Tue) 16:03
投稿者魔界の仮面弁士
> VB6+oo4oをVB.NETに移行しています。
COMオブジェクトの解放処理が面倒かも……。
ODP.NET等に移行した方が楽なのでは?

> sSS$ = P_ORA.Fields("USER_ID") ← カラム名を直指定して値取得のイメージ
『Valueプロパティ』を使う必要がありますね。
VB6 と違って、VB.NET では、「引数の無い Default Property」は省略できません。


とりあえず、こんな感じで。

'Oracleへの接続
Dim OraSession As OracleInProcServer.OraSession
OraSession = New OracleInProcServer.OraSessionClass
Dim OraDatabase As OracleInProcServer.OraDatabase
OraDatabase = DirectCast(OraSession.OpenDatabase(Server, User & "/" & Pass, 1), OracleInProcServer.OraDatabase)

'SELECT文を発行
Dim Dyn As OracleInProcServer.OraDynaset
Dyn = DirectCast(OraDatabase.CreateDynaset("SELECT * FROM DUAL", 0), OracleInProcServer.OraDynaset)

'後から、ReleaseComObjectにて Fieldsオブジェクトを
'解放する必要があるため、変数にキャッシュしておく
Dim Fs As OracleInProcServer.OraFields
Fs = DirectCast(Dyn.Fields, OracleInProcServer.OraFields)

'後から、ReleaseComObjectにて Fieldオブジェクトを
'解放する必要があるため、変数にキャッシュしておく
Dim F As OracleInProcServer.OraField
F = DirectCast(Fs("DUMMY"), OracleInProcServer.OraField)

'文字列型で取得
Dim S As String
Do Until Dyn.EOF
    S = CStr(F.Value)   '★FieldオブジェクトのValueプロパティ
    Trace.WriteLine(S)
    Dyn.MoveNext()
Loop

'COMオブジェクトの解放処理
System.Runtime.InteropServices.Marshal.ReleaseComObject(F)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Fs)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Dyn)
System.Runtime.InteropServices.Marshal.ReleaseComObject(OraDatabase)
System.Runtime.InteropServices.Marshal.ReleaseComObject(OraSession)

[ツリー表示へ]
タイトルRe: IOraField' から型 'String' へのキャストが有効ではありません。
記事No1473
投稿日: 2005/03/15(Tue) 16:04
投稿者るしぇ
>どのように対応していますでしょうか?
そもそも Dynaset は使わず OracleClient クラスを使ってます。
hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoracleclient.asp

…"USER_ID"フィールドのデータ型は何?Null が入ってて型変換に
失敗してるだけではないよね?

[ツリー表示へ]
タイトルありがとうございました
記事No1476
投稿日: 2005/03/16(Wed) 13:20
投稿者はせどん
魔界の仮面弁士さま、はじめみなさまご意見頂き
ありがとうございました。
今後の参考にさせて頂きます。

[ツリー表示へ]