URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4527
[ Назад ]

Исходное сообщение
"как вставить данные в BLOB из C"

Отправлено Savva , 01-Авг-05 11:35 
Требуется вставить двоичные данные в поле BLOB из программы на C.
Киньте плиз мааааленький примерчик.

Уже гуглил - не помогало :(


Содержание

Сообщения в этом обсуждении
"как вставить данные в BLOB из C"
Отправлено daapp , 01-Авг-05 12:50 
все телепаты в отпуске, так что пиши подробности

"Re: как вставить данные в BLOB из C"
Отправлено DeadMustdie , 01-Авг-05 21:30 
1. Документация на СУБД в таких случаях помогает.

2. В качестве издевательства, на память (возможны неточности,
без проверок на ошибки):


#include <oci.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define SERVICE_NAME "ORADB"
#define SERVICE_USER "basil"
#define SERVICE_PASSW "pupkinn"

int main()
{
  OCIEnv* penv = NULL;
  OCIError* perr = NULL;
  OCIServer* pserv = NULL;
  OCISvcCtx* psvc = NULL;
  OCISession* psess = NULL;
  OCITrans* ptrans = NULL;
  OCIStmt* pstmt = NULL;
  OCILobLocator* locator = NULL;
  ub4 lobEmpty = 0;
  unsigned short isNull = 0;
  OCIDefine* pdefine = NULL;

  /* Подключение к БД */

  putenv("NLS_LANG=ENGLISH.UTF8");
  OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
  OCIEnvInit(&penv, OCI_DEFAULT, 0, NULL);
  OCIHandleAlloc(penv, (dvoid**)&psvc, OCI_HTYPE_SVCCTX, 0, NULL);
  OCIHandleAlloc(penv, (dvoid**)&perr, OCI_HTYPE_ERROR, 0, NULL);
  OCIHandleAlloc(penv, (dvoid**)&pserv, OCI_HTYPE_SERVER, 0, NULL);
  OCIHandleAlloc(penv, (dvoid**)&psess, OCI_HTYPE_SESSION, 0, NULL);

  OCIServerAttach(pserv, perr, (text*)SERVICE_NAME,
                  strlen(SERVICE_NAME), OCI_DEFAULT);
  OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, pserv, 0, OCI_ATTR_SERVER, perr);
  
  OCIAttrSet(psess, OCI_HTYPE_SESSION, (text*)SERVICE_USER,
             strlen(SERVICE_USER), OCI_ATTR_USERNAME, perr);
  OCIAttrSet(psess, OCI_HTYPE_SESSION, (text*)SERVICE_PASSW,
             strlen(SERVICE_PASSW), OCI_ATTR_PASSWORD, perr));
  
  OCISessionBegin(psvc, perr, psess, OCI_CRED_RDBMS, OCI_DEFAULT));
  OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, psess, 0, OCI_ATTR_SESSION, perr));

  /* Создание транзакции */

  OCIHandleAlloc(penv, (dvoid**)&ptrans, OCI_HTYPE_TRANS, 0, NULL);
  OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, ptrans,
             0, OCI_ATTR_TRANS, perr);
  OCITransStart(psvc, perr, 2, OCI_TRANS_READWRITE);
  
  /* Вставка пустого BLOB-значения */
  OCIHandleAlloc(penv, (dvoid**)&pstmt, OCI_HTYPE_STMT, 0, NULL);
  {
    const char* sql = "INSERT INTO blob_tab(a) "
                      "VALUES(EMPTY_BLOB()) "
                      "RETURNING a INTO :1";
    OCIStmtPrepare(pstmt, perr, (text*)sql, strlen(sql),
                   OCI_NTV_SYNTAX, OCI_DEFAULT);
  }
  OCIDescriptorAlloc(penv, (dvoid**)&locator, OCI_DTYPE_LOB, 0, NULL);
  OCIAttrSet(locator, OCI_DTYPE_LOB, &lobEmpty, 0, OCI_ATTR_LOBEMPTY, perr);
  OCIDefineByPos(pstmt, &pdefine, perr, 1, &locator, -1, SQLT_BLOB, &isNull,
                 NULL, NULL, OCI_DEFAULT);
  OCIStmtExecute(psvc, pstmt, perr, 0, 0, NULL, NULL, OCI_DEFAULT);
  OCIStmtFetch(pstmt, perr, 1, OCI_FETCH_NEXT, OCI_DEFAULT);

  /* Запись в BLOB */
  {
    ub4 amt = 10;
    const char* data = "0123456789";
    OCILobRead(psvc, perr, locator, &amt, 1, data, amt,
               NULL, NULL, 0, SQLCS_IMPLICIT);
  }

  /* TODO: фиксация транзакции, закрытие соединения, освобождение ресурсов */
}