DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データ型について

環境/言語:[VB.NET/ACCESS2000+97]
分類:[.NET]

はじめまして、葵と申します。
初心者ですが、どうしても困ってしまい、投稿させていただきました。
お手数ですがよろしくお願いします。

 今、私はVB.NETを使用し、データベースプログラムに挑戦しています。
そこで、下のような問題に直面してしまい困っています。
 VB.NETでACCESSのテーブルに接続し、そこのデータを取得、また別のテーブルに取得したデータを代入するという。あるいみ単純なものなのですがデバッグエラーがでてしまい、どうしても先に進めません。
環境としましては
-------------------------------------------------------------
元データはACCESS97ファイルでテーブルのフィールドのデータ型は日付/時刻型で移動させたいデータは日付のみのデータ(例:2004/08/27)です。
移動先はモジュールを使用し、こちらで作成したACCESS2000ファイルでフィールドのデータ型は日付/時刻型と設定したテーブルです。
使用しているプログラムはVB.NET2003で、データを取得さえているモジュールはファンクションです。--------------------------------------------------------------------
sub ○○○○()
r = データビュー.AddNew()
r("列名") = ファンクション名()
end sub

,データビューを使用し、データを取得させています。
Function ファンクション名() As Date
Try
ファンクション = データビュー(0)(0)
Catch
End Try
End Function
--------------------------------------------------------------------
そこで最初は「テーブルのデータ型=Date」+「ファンクションのデータ型=Date」としたのですが、するとデバッグエラーが発生し「DateTimeからInt32へのキャストが無効です。」
「<元データの日付> 0:00:00>を格納できませんでした。必要な型はInt32です。」
と表示されます。

そこでFunctionの型をInt32にするとデバッグエラーはおきないのですが、実質データは移動されていません。データフィールドには「0:00:00」と時間を表示する部分しか代入されていないのです。ただ元となるデータには時間のデータは表示されておらず、日付のみなのです。

どうにかして、日付データのみを取得したいのですが、どうしたらいいでしょうか?

わかりにくい、書き方で申し訳ないのですが、大変困っています。
よろしくお願いします。
Accessの日付/時刻型は、System.Data.OleDb.OleDbType.DBDateに対応し、.NetではDateTime型にマップされます。
したがって、読むときは素直にDateTime型で読み、保存する時にDateTime.Dateで渡してあげればうまくいくかもしれません。(未検証)
この投稿はマルチポストです。

●マルチポストされている場所
ttp://vbnet-iku2.hp.infoseek.co.jp/cgi-bin/treecrsdx03/index.cgi?m=read&bnum=195&num=195

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
# 未検証なので、あまり状況を理解できていないのですが。

>>「DateTimeからInt32へのキャストが無効です。」
まず、どの部分のデータ型が「Int32」になっているのかを明確にしてください。
日付を扱っている状況下で、Int32という整数型が現れるのが不自然に思えます。
(データベース列が日付型ではなく、数値型として定義されていたならわかりますが)


> Accessの日付/時刻型は、System.Data.OleDb.OleDbType.DBDateに対応し、.NetではDateTime型にマップされます。
> したがって、読むときは素直にDateTime型で読み、保存する時にDateTime.Dateで渡してあげればうまくいくかもしれません。(未検証)

DBDate 型のフィールドは、日付情報しか持ちえなかったかと思います。
(ADO でいうところの adDBDate、OLE DBでいえば DBTYPE_DBDATE です)

しかしAccessの日付型は、内部的には倍精度浮動小数点型であり、範囲として
0100/01/01 00:00:00〜9999/12/31 23:59:59を秒情報まで保持しています。
ですから、正しくマッピングされるならば、Date 型であるべきでしょう。
(ADO でいうところの adDate、OLE DB でいえば DBTYPE_DATE です)
# あるいは、正確なマッピングでは無いけれど、DBTimeStampでも良いかも。


以下、今回の件と関係あるかどうかわかりませんが、参考までに。
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200308/03080034.txt
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200507/05070036.txt


>> 移動させたいデータは日付のみのデータ(例:2004/08/27)です。
正確には、日付のみというわけではなく、「2004/08/27 00:00:00」ですね。

Accessで時刻部が切り捨てて見えるのは、表示上、そのように見えるだけであり、
実際Accessで、テーブル列の「書式」プロパティに、『yyyy/mm/dd hh:nn:ss』と
いう値を入れておくと、日付と時刻の両方が見えるようになります。

ちなみに、時刻部だけの「12:34:56」といったデータを格納した場合も、
これもやはり、表示上そのように見えるというだけで、実データは
「1899/12/30 12:34:56」という値として格納される事になります。
  • 題名: Re[3]: データ型について
  • 著者: trapemiya
  • 日時: 2005/08/29 23:42:29
  • ID: 12454
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>DBDate 型のフィールドは、日付情報しか持ちえなかったかと思います。
>(ADO でいうところの adDBDate、OLE DBでいえば DBTYPE_DBDATE です)

その通りだと思います。言葉足らずでした。以下のページの内容のようなことが言いたかったのです。大変失礼いたしました。ごめんなさい。m(_ _)m
http://www.geocities.jp/mnow/cs_dataset2.html
皆さん、たくさんのアドバイスありがとうござます。
ただ、申しあけないのですが、まだすべて検証できていない状態でして、
明日には返信さえていてただきます。


■No12399に返信((報告)さんの記事)
> この投稿はマルチポストです。
すみません、数日、お返事がなかったためやむを得ず。
今後、このようなことは決してしません。
  • 題名: 【報告】この投稿はマルチポストです
  • 著者: (報告)
  • 日時: 2005/08/30 7:58:39
  • ID: 12466
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> すみません、数日、お返事がなかったためやむを得ず。
> 今後、このようなことは決してしません。

やむをえなかったら、最初に書いておくことがマナーじゃないでしょうか?

DOBON.NET | プログラミング道 | プログラミング掲示板