gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:25 25 4
gpt4 key购买 nike

我有一些 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

我将它绑定(bind)到:

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 是堆栈分配的,绑定(bind)不会将值复制到绑定(bind)句柄中,它只是设置一个指针,所以当它超出范围时,可以一直指向任何东西。所以我改为堆分配它。现在我当然得记账了,但我想这很简单。干杯!

关于c - OCIDate 在进入 Oracle 的过程中被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5939835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com