c - OCIDate在进入Oracle的途中被破坏



我有一些C代码来填充纪元时间的OCIDate

在我的主程序中:

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已经定义)。这完全显示了我所期望的。但是当它到达甲骨文时,它是胡言乱语,导致一个荒谬的日期(例如 65-JULY-7896 52:69:0或 ORA-1858 或 ORA-1801)。以前有人见过这样的事情吗?谢谢!

解决了

它 - 问题是ocidate是堆栈分配的,绑定不会将值复制到绑定句柄中,它只是设置一个指针,所以当它超出范围时,它可能指向任何东西。所以我把它堆分配了。现在我当然必须把它记账,但我想这很简单。干杯!

相关内容

  • 没有找到相关文章

最新更新