The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как вставить данные в BLOB из C"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"как вставить данные в BLOB из C" 
Сообщение от Savva emailИскать по авторуВ закладки(??) on 01-Авг-05, 11:35  (MSK)
Требуется вставить двоичные данные в поле BLOB из программы на C.
Киньте плиз мааааленький примерчик.

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "как вставить данные в BLOB из C" 
Сообщение от daapp Искать по авторуВ закладки on 01-Авг-05, 12:50  (MSK)
все телепаты в отпуске, так что пиши подробности
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Re: как вставить данные в BLOB из C" 
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 01-Авг-05, 21:30  (MSK)
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: фиксация транзакции, закрытие соединения, освобождение ресурсов */
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру