【问题标题】:OCIDate getting mangled on the way into OracleOCIDate 在进入 Oracle 的过程中被破坏
【发布时间】:2011-05-09 16:36:38
【问题描述】:

我有一些 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 已定义)。这正是我所期望的。但是当它到达 Oracle 时,它​​是胡言乱语,导致一个无意义的日期(例如 65-JULY-7896 52:69:0 或 ORA-1858 或 ORA-1801)。有没有人见过这样的事情?谢谢!

【问题讨论】:

  • 您能否显示您实际绑定 OCIDate 对象的代码?
  • sword x = OCIBindByPos(s, &bh, h.err, (ub4)p, (dvoid*)&ocidate, (sb4)sizeof(ocidate), SQLT_ODT, 0, 0, 0, 0, 0, OCI_DEFAULT);
  • s 语句句柄、bh 绑定句柄、h.err 错误句柄、p 位置等
  • 您的sizeof 是指OCIDate,还是&ocidate?完全有可能我误读了,但看起来它发送的是指针的大小而不是结构的大小?
  • 我想知道是不是因为ocidate 是一个局部变量,因此当我最终调用OCIStmtExecute() 时超出范围

标签: c oracle datetime oracle-call-interface


【解决方案1】:

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

【讨论】:

  • 或者您将基于堆栈的 OCIDate 保留在 OCIStmtExecute() 的范围内。这对我有用。这样就没有明确的簿记。
猜你喜欢
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多