こんにちは。
現在oo4oでOracleに接続し、MSFlexGridに表示しています。
テーブル内にnull値ないと読み込めるのですが、null値があると
以下のエラーが表示されます。
「実行時エラー'94' NULL値の使い方が不正」
MSFlexGridにNULL値を入れるにはどうすればいいのでしょうか?
以下のコードで行っています。
Option Explicit
'*************oo4oオブジェクト変数の宣言*************
'OraSessionクラス : 変数名 oraSession
'OraDatabaseクラス : 変数名 oraDB
'OraDynasetクラス : 変数名 oraTable
'****************************************************
Dim oraSession As Object
Dim oraDB As OraDatabase
Dim oraTable As OracleInProcServer.OraDynaset
---------------------------------------------------------
Private Sub cmdList_Click()
'全体表示をクリックしたときの処理
Dim intColumn As Integer, intRow As Integer
Dim intColMax As Integer
oraTable.Refresh
MSHFlexGrid1.Rows = oraTable.RecordCount + 1
intColMax = oraTable.Fields.Count
MSHFlexGrid1.Cols = intColMax + 1
'テーブル名の表示
With oraTable
Do While intColumn < intColMax
MSHFlexGrid1.TextMatrix(0, intColumn + 1) = _
.Fields(intColumn).Name
intColumn = intColumn + 1
Loop
End With
intRow = 1
intColumn = 1
'テーブル情報の表示
With oraTable
Do Until .EOF
MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
For intColumn = 1 To intColMax
MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
.Fields(intColumn - 1).Value
Next intColumn
intRow = intRow + 1
.MoveNext
Loop
End With
End Sub
------------------------------------------------------------------
Private Sub Form_Load()
Set oraSession = CreateObject("OracleInProcServer.XOraSession")
Set oraDB = oraSession.OpenDatabase _
("DB名", "ユーザー名/パスワード", ORADB_DEFAULT)
Set oraTable = oraDB.CreateDynaset("select * from emp", 0&)
End Sub
cmdListボタンを押すとMSHFlexGrid1にOracleのempというテーブルが表示
されます。
環境は VB6.0
Oracle8.1.7 です
長くなってしまいましたが…皆様よろしくお願いいたします<(__)>
こういう時は、
〜 = oraTable.Fields(n).Value & ""
のように、空文字列を連結すればOKです。
あるいは、Format関数を使う事もできます。例えば、
〜 = Format( oraTable.Fields(n).Value, "#,0;;;(空です)")
のようにすれば、
12345 なら "12,345"
Null なら "(空です)"
になります。
遅くなってしまって申し訳ありません。
魔界の仮面弁士様回答ありがとうございます(^^)
空文字列の連結を以下のように行ってみたのですが、Date型の
データがテーブルに含まれているとエラーが出てしまうようです(TT)
For intColumn = 1 To intColMax
MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
.Fields(intColumn - 1).Value & ""
Next intColumn
Format関数のほうはエラーは出ず、表示されるようなのですが、
Date型のデータが含まれていると表示がおかしくなってしまいます。
そこで、良くわからないところがあるのですが、Formatの
>"#,0;;;(空です)"
の部分は何を表しているのでしょう。「;;;」という書き方が
はじめてで何を表しているのかわからなくて・・・
よろしくお願いいたします。
あと、NullをNullとしてMSFlexGridに表示することって出来るのでしょうか?
> >"#,0;;;(空です)"
> の部分は何を表しているのでしょう。「;;;」という書き方が
> はじめてで何を表しているのかわからなくて・・・
ヘルプで『Formar 関数』について調べて見てください。
左上に書いてある「関連項目」にて、詳しく解説されていますよ。(^_^;)
で…この"#,0;;;(空です)"は『数値表示書式』と呼ばれる物です。
数値表示書式には、4種類の書式パターンがあり、
1. 正数
2. 負数
3. ゼロ
4. NullまたはEmpty
のそれぞれに対して、書式を定義できるようになっています。
複数の書式を定義する場合は、それぞれを ; で区切ります。
例えば、
Format(値, "正数で#,0;負数で#,0;ゼロです;ヌルです")
のような書式に対して、いろいろな値(正数、負数、0、Nullなど)を
指定して見てください。第2引数で指定した書式の意味がわかると思います。
同様に『文字列表示書式』にも複数の書式(2書式)を同時に定義でき、例えば
Format(now, "文字列の@@@;空です")
のような書式にする事ができます。こちらは、
1. 以下の 2.以外のデータ
2. NullまたはEmptyまたは空文字列
という意味になります。
なお、『日付表示書式』には1つの書式しかありませんので、
「;」で複数の書式を割り当てる事はできません。
> Date型のデータが含まれていると表示がおかしくなってしまいます。
Date型の場合には、どのようにして表示させていますか?
例えば、Format関数等を使わずに表示させた場合、
コントロールパネルの設定に応じた書式が使われますので、
環境によって、違う書式で出力される事になります。
また、Format関数を使うにしても、日付表示書式ではなく、
文字列書式や数値書式を適用してしまったとすれば、
望むべき結果は得られないでしょう。
> あと、NullをNullとしてMSFlexGridに表示することって出来るのでしょうか?
そもそもMSFlexGridは、データをStringで保持しています。
しかし、String型はNullを保持できませんので、替わりに、
「"Null"という文字列をセルに表示する」
「"(空データ)"という文字列をセルに表示する」
「何も表示しない("")が、セルの背景色を薄い黄色にする」
などといった、他の表現方法で誤魔化して見ては如何でしょう。
(元の値がNullかどうかは、IsNull関数で調べる事ができます)
>ヘルプで『Formar 関数』について調べて見てください。
>左上に書いてある「関連項目」にて、詳しく解説されていますよ。(^_^;)
あ・・・(><;)気づきませんでした。申し訳ありません。
今度から気をつけて見るようにいたしますm(__)m
でも、説明が分かり易くてすごく良かったです(^^)
本当にありがとうございます!
>Date型の場合には、どのようにして表示させていますか?
以下のコードでデータをMSFlexGridに入れていたので、特に
Format関数などは使っておりませんでした。
'テーブル情報の表示
With oraTable
Do Until .EOF
MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
For intColumn = 1 To intColMax
MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
.Fields(intColumn - 1).Value
Next intColumn
intRow = intRow + 1
.MoveNext
Loop
End With
>コントロールパネルの設定に応じた書式が使われますので、
>環境によって、違う書式で出力される事になります。
書式がコントロールパネルの設定による事をはじめて知りましたので
以下のコードに変更し、Nullも
>「"(空データ)"という文字列をセルに表示する」
という、魔界の仮面弁士さんの考えを使用させていただきました。
With oraTable
Do Until .EOF
MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
For intColumn = 1 To intColMax
If IsNull(.Fields(intColumn - 1).Value) Then
MSHFlexGrid1.TextMatrix(intRow, intColumn) =
_ "(空です)"
ElseIf IsDate(.Fields(intColumn - 1).Value) Then
MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
Format(.Fields(intColumn - 1).Value, "yyyy/mm/dd")
Else
MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
.Fields(intColumn - 1).Value
End If
Next intColumn
intRow = intRow + 1
.MoveNext
Loop
End With
以上が解決したコードです。ありがとうございました<(__)>
ツイート | ![]() |