OCIDate становится запутанным на пути в Oracle - PullRequest
1 голос
/ 09 мая 2011

У меня есть некоторый 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).Кто-нибудь видел что-нибудь подобное раньше?Спасибо!

1 Ответ

2 голосов
/ 10 мая 2011

Решено - проблема была в том, что ocidate был выделен стеком, и связывание не копирует значение в указатель привязки, оно просто устанавливает указатель, поэтому, когда он выходит из области видимости, он мог указывать на что-либо,Так что я выделил кучу вместо этого.Теперь, конечно, я должен это сделать, но, думаю, это достаточно просто.Ура!

...