1

OCIDateエポック時間からデータを入力する C コードがいくつかあります。

私のメインプログラムでは:

OCIDate ocidate;
epoch_to_ocidate(c.f, &ocidate);

そして図書館で:

void epoch_to_ocidate(double d, OCIDate* ocidate) {
  time_t t = (time_t)d;
  struct tm *ut = localtime(&t); /* convert to a Unix time */

  OCIDateSetDate(ocidate, ut->tm_year + 1900, ut->tm_mon + 1, ut->tm_mday); 
  OCIDateSetTime(ocidate, ut->tm_hour + 1, ut->tm_min + 1, ut->tm_sec + 1);
}

呼び出しルーチンにチェックがあるため、これは正しいと確信しています。

#ifdef DEBUG
    char* fmt = "DD-MON-YYYY HH24:MI:SS";
    ub4 dbufsize=255;
    debug("testing converted OCIDate:");
    OCIDateToText(h.err, (const OCIDate*)&ocidate, (text*)fmt, (ub1)strlen(fmt), (text*)0, (ub4)0, &dbufsize, (text*)dbuf);
    debug(dbuf);
#endif

そして、私はそれを次のようにバインドしています:

OCIBindByPos(s, &bh, h.err, (ub4)p, (dvoid*)&ocidate, (sb4)sizeof(ocidate), SQLT_ODT, 0, 0, 0, 0, 0, OCI_DEFAULT);

(dbufは既に定義されています)。そして、それはまさに私が期待するものを示しています。しかし、それが Oracle に到着すると意味不明であり、無意味な日付になります (たとえば65-JULY-7896 52:69:0、ORA-1858 または ORA-1801)。誰もこのようなものを見たことがありますか?ありがとう!

4

1 に答える 1

2

解決しました-問題はocidateスタックが割り当てられ、バインディングは値をバインドハンドルにコピーせず、ポインターを設定するだけなので、スコープ外に出たとき、それは何かを指している可能性がありました。そのため、代わりにヒープ割り当てを行いました。もちろん、帳簿をつける必要がありますが、それで十分簡単だと思います。乾杯!

于 2011-05-09T21:04:27.297 に答える