DBグリッドでの空文字

解決


ぐー  2003-05-23 11:20:58  No: 107256  IP: [192.*.*.*]

DBグリッドをAccessのテーブルと関連付けているのですが、セルのデータを消して
から別のセルに移動しようとすると「データ型の変換エラーが発生しました」という
エラーが出てしまいます。
これを回避する為にはどのような方法があるのでしょうか?
ちなみに、VB5を使用していて、データベースはAccess、
関連付いているフィールドの型はSingle型です。

編集 削除
だっちゃん  2003-05-27 19:47:48  No: 107257  IP: [192.*.*.*]

こんちは。

稲兎さんの質問「ADOを用いたデータの追加について」に書いたことなんですが、空文字をDBに設定できないだと思いますよ。

詳しくは、稲兎さんのレスを見てください。

もし、違ってたらごめんなさいです。

編集 削除
だっちゃん  2003-05-27 20:01:50  No: 107258  IP: [192.*.*.*]

ごめんなさい。

Single型のお話でしたね。
空文字の設定はプロパティにないですね。

Single型の場合は、0を設定してあげればよいのでは・・・。

編集 削除
ぐー  2003-05-28 09:32:55  No: 107259  IP: [192.*.*.*]

だっちゃんさん回答ありがとうございます。

そうなんですよね。
一応、0を設定して対応してはいるのですが・・・。
やっぱり、これはACCESS側の問題なんですよね。

もしかしたら、VBで何か設定が出来るのではと思って質問してみました。
とりあえず、0を設定するということで解決にしたいと思います。

編集 削除
だっちゃん  2003-05-28 10:08:24  No: 107260  IP: [192.*.*.*]

こんちは。

少し考えてみました。
実際、ACCESS内ではSingle型でもNULL文字は挿入できるわけなんで・・・、
空文字(長さ0の文字)の場合はNULLに変換してあげればOKでした。

なんで、AfterColUpdateイベントで下記のようなプログラムを書けばDBに
空文字(実際はNULL)を挿入できるはずです。

Private Sub DataGrid1_AfterColUpdate(ByVal ColIndex As Integer)

    If Len(Trim(DataGrid1.Columns(0).Text)) = 0 Then
        DBGrid1.Columns(0).Text = Null
    End If

End Sub

参考にしてみてください。

編集 削除
ぐー  2003-05-28 13:34:52  No: 107261  IP: [192.*.*.*]

だっちゃんさん考えて頂きありがとうございます。

ご指摘のとおり、ACCESS上では空文字でも入力できるのですが、
DBGridでは出来ないという現象でした。
私も同じように、Nullを代入してやってみたのですが
どうしても、『データ型の変換エラーが発生しました』と
出てきてしまいます。

一応、AfterColUpdateイベントの前で、エラーになっているようなので、
BeforeColUpdateイベントで教えていただいたコードを記述してやってみましたが
やっぱりダメでした。

Private Sub DataGrid1_BeforeColUpdate(ByVal ColIndex As Integer, 
                                      OldValue As Variant,
                                      Cancel As Integer)

    If Len(Trim(DataGrid1.Columns(ColIndex).Text)) = 0 Then
        DataGrid1.Columns(ColIndex).Text = Null
    End If

End Sub

う〜ん。なぜNullでもダメなのかわからないです。。。

編集 削除
だっちゃん  2003-05-28 15:06:07  No: 107262  IP: [192.*.*.*]

う〜ん。わかんないですね?

ちなみにAfterColUpdateイベントで記述したのは間違いでした。
もうしわけないです。

もしかするとセルを移動するたびにDBを更新している可能性があるので、
例えばDB更新前のBeforeUpdateイベントで実行したらうまくいかないかな?

しかし、BeforeUpdateイベントにはColIndexがないので直接カラム番号を入力する必要があります。

Private Sub DataGrid1_BeforeUpdate(Cancel As Integer)
    If Len(Trim(DataGrid1.Columns(0).Text)) = 0 Then
        DataGrid1.Columns(0).Text = Null
    End If
End Sub

度々、間違った情報をUPしてるかもしれません。
動かなかったときはごめんしてください。

編集 削除
ぐー  2003-05-28 17:06:57  No: 107263  IP: [192.*.*.*]

毎度だっちゃんさんありがとうございます。

BeforeUpdateイベントでやったら出来ました!!
どうもありがとうございます。
0と空白は区別したかったのでとても助かりました。
これで解決です。

しかし、最後にもう一つだけ質問してもよろしいですか?
何故、BeforeColUpdateじゃなくてBeforeUpdateなんでしょうか?
「BeforeUpdate」と「BeforeColUpdate」の違いってなんなんでしょうか?
ヘルプを見たんですが、同じように更新される前にイベント発生すると書いてあるようで、BeforeUpdateで出来た理由がちょっとわからないのですが・・・。

編集 削除
だっちゃん  2003-05-28 17:27:27  No: 107264  IP: [192.*.*.*]

あくまで推測なんですが・・・。

基本RDBMSにはロックとロールバックって考えがあります。
なので、DB連結系のコントロールはセル(カラム)が更新されるとDBに対し情報を書き込みに行きます。なのでセル(カラム)の移動ごとにBeforeUpdateは発生していることになりますね。

つまり、BeforeUpdateってイベントはDBに対し情報を書き込む前のイベントで、
BeforeColUpdateは、コントロールのバッファを更新(画面情報確定)を行う前のイベントって感じなのかな?
※BeforeUpdate→BeforeColUpdateの順でイベント発生

今回の現象を考えるとDBに書き込みを行うときにSingle型に空文字を書き込んで落ちていました。
そして、BeforeUpdateにプログラムを記述してエラーが解消されたなら、
BeforeColUpdateイベントの前にDBの書き込みが起きていて、
結局BeforeColUpdateイベントまで処理が来てなかったて感じでしょう!!

なんか取り留めない書き方になってしまいました。ごめんなさい・・・。

編集 削除
ぐー  2003-05-28 17:53:03  No: 107265  IP: [192.*.*.*]

だっちゃんさん誤らないで下さい(笑)
たいへん為になっていますし、解決して頂いたので。

>つまり、BeforeUpdateってイベントはDBに対し情報を書き込む前のイベントで、
>BeforeColUpdateは、コントロールのバッファを更新(画面情報確定)を行う前の
>イベントって感じなのかな?

これはイメージできました。
ですが、イベント順は、ブレイクポイントをはってデバックした結果ですと、
BeforeColUpdateの方が先に発生しているみたいです。
難しいですねぇ。

とりあえず、これ以上は当初の質問の内容と離れてしまいそうなので、終わりにしますね。
また別に質問を出してみたいと思います。
ありがとうございました。またなんかあったらお願いします。

編集 削除
とおりすがり  2003-12-05 17:26:21  No: 107266  IP: [192.*.*.*]

気になったので。
DATAオブジェクトやDBグリッドの仕様上の問題で
マイクロソフトにも対応方法が出ています。

マイクロソフト サポート技術情報 - 172101      
[VB] データ コントロール使用時の "データ型の変換エラーが発生しました" エラー 
この記事は、以前は次の ID で公開されていました: JP172101

http://support.microsoft.com/default.aspx?scid=kb;ja;172101

編集 削除