データベースの日付時刻型をそのまま使用できませんか?

[戻る]
KW 2003/10/15(水) 16:15:35
環境
WinNT
Access2000
ODBC接続
VC++6.0
Win32 Console Applicationから作成

一つのテーブルに4つフィールドがあって、その内の一つに日付時刻型があります。
クラスウィザードを使用して、接続したところ…
m_PICS = _T("");
m_RWEIGHT = 0.0f;
m_RNAME = _T("");
m_TIME = 0;←A
m_nFields = 4;

となっていました。
m_TIMEがAccess上では、yyyy/mm/dd hh:nnで指定しています。

Aの部分が怪しいと思うのですが、それと、表示の部分の「'%s'」も違うと思います。

いろいろ調べていると、「CTIME」、「CString」、「COledatetime」というクラスがそれらし
いのですが、よくわかりませんでしたので、教えを請いに参りました。
御願い致します。

たいちう 2003/10/15(水) 16:31:29
m_TIME は COleDateTime 型だとすると、
m_TIME = 0L;  でどうでしょう。

COleDateTimeのコンストラクタに、int 型を1つだけとるものがないためです。
time_t 型(その実態はlong int)をとるコンストラクタならありますので、
右辺を0(これはint)から0L(long int)にするとうまくいきます。

でもここは、クラスウィザードの吐き出した所なんだよね。
何年か前、苦労しました。
数あるVCのバグの1つだと私は認識しています。

KW 2003/10/15(水) 16:45:18
m_Time=0L;
と変更すると言うことでしょうか?

>m_TIME は COleDateTime 型だとすると、
それは、どちらで宣言すればよろしいのでしょうか?

DoFieldExchange(CFieldExchange* pFX)内では、

RFX_Date(pFX, _T("[SYS_TIME]"), m_TIME);
となっておりまして、MSDNを見ると
「CTime または TIMESTAMP_STRUCT を使用して時刻と日付のデータを転送します。」
と記述されておりましたので、m_TIMEに入っている意味のわからない数字は時刻を表している
のでしょうか?もし、そうだとすれば、%dのように、'時刻'として取得するにはどのようにす
ればよいのでしょうか?

たいちう 2003/10/15(水) 17:04:01
> m_Time=0L;
> と変更すると言うことでしょうか?

ミスタイプだろうからYes。正しくは、m_TIME = 0L;です。

> >m_TIME は COleDateTime 型だとすると、
> それは、どちらで宣言すればよろしいのでしょうか?

すでに宣言されていると思います。ヘッダーファイルを確認してください。

> m_TIMEに入っている意味のわからない数字は時刻を表しているのでしょうか?

この説明では私には判断できません。
正しく設定された時刻を意味の判らない数字といっているのか、
間違った設定で無効な時刻を表しているのか?
どんな数字が入っていました?

> %dのように、'時刻'として取得

時刻を表す文字列が欲しいなら、COleDateTime::Formatを使ってください。
ヘルプはあるよね。

KW 2003/10/15(水) 17:14:51
ヘッダーファイルを確認したところ、宣言が「CTime」となっていました。
"意味のわからない数字"というのは、グレゴリオ暦+指定日時分の秒数とかだと思います。

ヘッダー部の宣言を「OleDataTime」に変更してやってみます。

後ほど、報告させていただきます。

KW 2003/10/15(水) 17:47:28
//関数開始
COleDateTime date(dbStep1.m_TIME);
//こちらで、オブジェクト作成しています

printf("Time = '%s'" ,(LPCTSTR)date.Format("%Y/%m/%d"));
//出力です。

出力結果は
1970/01/01でした。
しかし、実際に入っているデータは、2003/09/25です。

デバッグして、実際(dbStep1.m_TIME)に入っているデータを確認してみたところ…
m_dt=37889.500000000
m_status=valid
となっておりましたが、COleDateTimeの使用方法が間違っているんでしょうか?

たいちう 2003/10/15(水) 17:51:45
> でもここは、クラスウィザードの吐き出した所なんだよね。
> 何年か前、苦労しました。
> 数あるVCのバグの1つだと私は認識しています。

すみません、勘違いしてました。

私のケースではクラスウィザードのデフォルトがCTime型だったのを
COleDateTime型に変えたため、m_TIME = 0;を直す必要が生じたんでした。
苦労した記憶しか残ってなかったようです。

で、CTime t = 0;はコンパイル通るので、KWさんには全く見当違いの事を
書いてしまったのかもしれません。CTimeにもFormatはありますし。

KW 2003/10/15(水) 18:00:52
そうだったんですか。
でも、折角ですから、COleDateTimeを覚えるために、このままやってみようと思います。

なんとなくですが、現状の日付がおかしいのは、データベースの日付のフォーマットのせいかも
しれません。

データベースでは、yyyy/mm/dd hh:nn となっておりまして、秒単位がないのが原因なのでし
ょうか?

たいちう 2003/10/15(水) 18:27:57
> デバッグして、実際(dbStep1.m_TIME)に入っているデータを確認してみたところ…
> m_dt=37889.500000000
> m_status=valid
> となっておりましたが、COleDateTimeの使用方法が間違っているんでしょうか?

COleDateTime date(dbStep1.m_TIME);

の直前と直後のm_TIMEの値が上記の通りであることを確認されているんですよね?
直後のdateの値も。

COleDateTimeの使い方は間違ってないようです。
下記のソースで確認してみてください。

    {
        COleDateTime m_TIME;
        m_TIME.m_dt = 37889.50000;
        m_TIME.m_status = COleDateTime::valid;
        COleDateTime date(m_TIME);
        TRACE("Time = '%s'\n", date.Format("%Y/%m/%d"));
    }

> データベースでは、yyyy/mm/dd hh:nn となっておりまして、秒単位がないのが原因な
のでし
> ょうか?

アクセスの設定なら表示だけですので、内部的には秒まで(もっと細かく)持ってます。
dateを宣言しているときに、本当にm_dt = 37889.5であることを確認されているなら、
私にはお手上げです。

dbStep1の宣言はどうなっているでしょうか?

KW 2003/10/15(水) 18:41:53
たいちうさんのコードを使用したら、2003/09/25になりました。
元に戻して、値の変化を見ていたのですが、
関数開始
オブジェクト宣言後 25569.375000000(この値が代入されていました)

データベースをオープンすると、
37889.500000000になります。

そして表示が1970/01/01になります。

…。
もしかして、データベースをオープンしたあとに宣言しないといけないのでは?
ちょっとやってみます。

KW 2003/10/15(水) 18:45:20
[[解決]]
そのようでした^^
オープンした後に、オブジェクトを宣言することで、値が入るみたいです。
ありがとうございました。

古いスレッドには追加発言できません。