DBグリッドをAccessのテーブルと関連付けているのですが、セルのデータを消して
から別のセルに移動しようとすると「データ型の変換エラーが発生しました」という
エラーが出てしまいます。
これを回避する為にはどのような方法があるのでしょうか?
ちなみに、VB5を使用していて、データベースはAccess、
関連付いているフィールドの型はSingle型です。
こんちは。
稲兎さんの質問「ADOを用いたデータの追加について」に書いたことなんですが、空文字をDBに設定できないだと思いますよ。
詳しくは、稲兎さんのレスを見てください。
もし、違ってたらごめんなさいです。
ごめんなさい。
Single型のお話でしたね。
空文字の設定はプロパティにないですね。
Single型の場合は、0を設定してあげればよいのでは・・・。
だっちゃんさん回答ありがとうございます。
そうなんですよね。
一応、0を設定して対応してはいるのですが・・・。
やっぱり、これはACCESS側の問題なんですよね。
もしかしたら、VBで何か設定が出来るのではと思って質問してみました。
とりあえず、0を設定するということで解決にしたいと思います。
こんちは。
少し考えてみました。
実際、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
参考にしてみてください。
だっちゃんさん考えて頂きありがとうございます。
ご指摘のとおり、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でもダメなのかわからないです。。。
う〜ん。わかんないですね?
ちなみに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してるかもしれません。
動かなかったときはごめんしてください。
毎度だっちゃんさんありがとうございます。
BeforeUpdateイベントでやったら出来ました!!
どうもありがとうございます。
0と空白は区別したかったのでとても助かりました。
これで解決です。
しかし、最後にもう一つだけ質問してもよろしいですか?
何故、BeforeColUpdateじゃなくてBeforeUpdateなんでしょうか?
「BeforeUpdate」と「BeforeColUpdate」の違いってなんなんでしょうか?
ヘルプを見たんですが、同じように更新される前にイベント発生すると書いてあるようで、BeforeUpdateで出来た理由がちょっとわからないのですが・・・。
あくまで推測なんですが・・・。
基本RDBMSにはロックとロールバックって考えがあります。
なので、DB連結系のコントロールはセル(カラム)が更新されるとDBに対し情報を書き込みに行きます。なのでセル(カラム)の移動ごとにBeforeUpdateは発生していることになりますね。
つまり、BeforeUpdateってイベントはDBに対し情報を書き込む前のイベントで、
BeforeColUpdateは、コントロールのバッファを更新(画面情報確定)を行う前のイベントって感じなのかな?
※BeforeUpdate→BeforeColUpdateの順でイベント発生
今回の現象を考えるとDBに書き込みを行うときにSingle型に空文字を書き込んで落ちていました。
そして、BeforeUpdateにプログラムを記述してエラーが解消されたなら、
BeforeColUpdateイベントの前にDBの書き込みが起きていて、
結局BeforeColUpdateイベントまで処理が来てなかったて感じでしょう!!
なんか取り留めない書き方になってしまいました。ごめんなさい・・・。
だっちゃんさん誤らないで下さい(笑)
たいへん為になっていますし、解決して頂いたので。
>つまり、BeforeUpdateってイベントはDBに対し情報を書き込む前のイベントで、
>BeforeColUpdateは、コントロールのバッファを更新(画面情報確定)を行う前の
>イベントって感じなのかな?
↑
これはイメージできました。
ですが、イベント順は、ブレイクポイントをはってデバックした結果ですと、
BeforeColUpdateの方が先に発生しているみたいです。
難しいですねぇ。
とりあえず、これ以上は当初の質問の内容と離れてしまいそうなので、終わりにしますね。
また別に質問を出してみたいと思います。
ありがとうございました。またなんかあったらお願いします。
気になったので。
DATAオブジェクトやDBグリッドの仕様上の問題で
マイクロソフトにも対応方法が出ています。
マイクロソフト サポート技術情報 - 172101
[VB] データ コントロール使用時の "データ型の変換エラーが発生しました" エラー
この記事は、以前は次の ID で公開されていました: JP172101
http://support.microsoft.com/default.aspx?scid=kb;ja;172101
ツイート | ![]() |