[リストへもどる]
一括表示

投稿時間:2003/12/12(Fri) 11:17
投稿者名:孤軍奮闘
URL :
タイトル:
日付型にNULL値を!
日付型フィールドにNULL値を送りたいのですが(ADOで)、種類が違いますというエラーになって
しまいます。フィールドを文字型に変えようと思いましたが、値のあるデータについては日付計算
処理もするので日付型のままでやりたいのです。何かよいアドバイスを!!
DBはSQL-server2000で、そのフィールドはNULL値を許容するとなっています。DB上からは可能で
す。(キーでもないので)
フィールド名を点検日とすると・・・
rs!点検日 = "" としてるだけですが、やっぱこれでは無理ですよね〜

投稿時間:2003/12/12(Fri) 11:45
投稿者名:ぽぅ
Eメール:
URL :
タイトル:
Re: 日付型にNULL値を!
# 回答ではありません。

ホントだ!
  cn.Execute "insert into TABLE1 (DATE_FIELD) values ('')"
は通りますが、
  rs.AddNew
  rs!DATE_FIELD = ""
  rs.Update
はエラーになりますね。

投稿時間:2003/12/12(Fri) 12:04
投稿者名:孤軍奮闘
URL :
タイトル:
Re^2: 日付型にNULL値を!
> # 回答ではありません。
>
> ホントだ!
>   cn.Execute "insert into TABLE1 (DATE_FIELD) values ('')"
> は通りますが、
>   rs.AddNew
>   rs!DATE_FIELD = ""
>   rs.Update
> はエラーになりますね。
えっ?SQLできました?(試してないだけですが・・・テーブル上で無理やり空白にしただけなので)
この場合の実行結果はどうなりますか?ADOでは1899/01/01となってしますのですが・・・
ちなみにrs!DATE_FIELD = vbNullでnanashiさんのご意見ですが・・・

投稿時間:2003/12/12(Fri) 11:46
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re: 日付型にNULL値を!
> rs!点検日 = ""

これは空文字列を入れてることになります。
Nullと空文字列は別物なので、これではエラーが出ます。

試してはいませんが

    rs!点検日 = vbNull

とかでどうでしょう?

投稿時間:2003/12/12(Fri) 11:57
投稿者名:孤軍奮闘
URL :
タイトル:
Re^2: 日付型にNULL値を!
> > rs!点検日 = ""
>
> これは空文字列を入れてることになります。
> Nullと空文字列は別物なので、これではエラーが出ます。
>
> 試してはいませんが
>
>     rs!点検日 = vbNull
>
> とかでどうでしょう?
我ながら当たり前のような構文を書いてしまってすいません・・・
で、早速ですが、上記の構文をテストしてみました!
実行処理としては、受け付けてくれましたが、実際に格納される値は1899/12/31となっていました
空白にする場合に、無理やり1900/01/01を代入するやり方でやろうと思いましたが
構文的にnanashiさんの教えの方が楽なので、とりあえず使わせてもらいます。
ありがとうございました!!

投稿時間:2003/12/12(Fri) 12:18
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re^3: 日付型にNULL値を!
> 実行処理としては、受け付けてくれましたが、実際に格納される値は1899/12/31となっていました

むむ、これはちょっと自分的に予想外でした…。
最近Nullを使わないようにしてたのでうろ覚えですが、ひょっとしたら単純に

  rs!点検日 = NULL

でNULL値を入れられたかもしれません。
これまた試してないんですが…。

投稿時間:2003/12/12(Fri) 12:52
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: 日付型にNULL値を!
> 試してはいませんが
>     rs!点検日 = vbNull
> とかでどうでしょう?

いや、vbNull ではまずいでしょう。使うなら Null です。
      rs.Fields("点検日").Value = Null

[vbNull] は、「VarType関数」の戻り値として使われる定数であり、それ自体は、
「Long型の 1 という値」です。―――[vbString]や[vbLong]等の親戚ですね。

ちなみに、VBのDate型は、内部的には「1899年12月30日からの経過日数」として保持されているため、
vbNull(すなわち、1)を代入すると、「1899年12月31日」と見なされる事になります。

なお、SQLで書くのであれば、
  SQL = "INSERT INTO TABLE1 (点検日) VALUES (NULL)"
ですね。

投稿時間:2003/12/12(Fri) 13:14
投稿者名:孤軍奮闘
URL :
タイトル:
Re^3: 日付型にNULL値を!
> > 試してはいませんが
> >     rs!点検日 = vbNull
> > とかでどうでしょう?
>
> いや、vbNull ではまずいでしょう。使うなら Null です。
>       rs.Fields("点検日").Value = Null
>
> [vbNull] は、「VarType関数」の戻り値として使われる定数であり、それ自体は、
> 「Long型の 1 という値」です。―――[vbString]や[vbLong]等の親戚ですね。
>
> ちなみに、VBのDate型は、内部的には「1899年12月30日からの経過日数」として保持されているため、
> vbNull(すなわち、1)を代入すると、「1899年12月31日」と見なされる事になります。
>
> なお、SQLで書くのであれば、
>   SQL = "INSERT INTO TABLE1 (点検日) VALUES (NULL)"
> ですね。
早速ですが、試してみました。 うまくいきました!! 難しく考えすぎてたみたいです。
目から鱗です。

投稿時間:2003/12/12(Fri) 11:48
投稿者名:孤軍奮闘
URL :
タイトル:
Re: 日付型にNULL値を!
> 日付型フィールドにNULL値を送りたいのですが(ADOで)、種類が違いますというエラーになって
> しまいます。フィールドを文字型に変えようと思いましたが、値のあるデータについては日付計算
> 処理もするので日付型のままでやりたいのです。何かよいアドバイスを!!
> DBはSQL-server2000で、そのフィールドはNULL値を許容するとなっています。DB上からは可能で
> す。(キーでもないので)
> フィールド名を点検日とすると・・・
> rs!点検日 = "" としてるだけですが、やっぱこれでは無理ですよね〜
rs!点検日に該当するフォーム上テキストボックスが空白の場合は、システム上在りあえない日付
(1900/01/01)で格納するようにしました。DBからのデータロード時も逆手にとって日付が1900/01/01
であれば、テキストボックスを空白表示するといった方法で解決はしましたが、他によい方法があれば
是非、お願いします