2013-03-14 4 views
0

Я кодируюсь на C и использую библиотеку Libpq Postgresql, и я хотел бы сохранить изображение PNG в базе данных типа «bytea». Я много часов искал в сети и не мог найти хороший пример для обработки этой работы, поэтому хотел написать здесь и обратиться за помощью.Ошибка при отправке изображения в столбцы bytea в postgresql db с библиотекой libpq

У меня есть 12 параметров для привязки, и один из них - изображение PNG. Остальные - char *, и никаких проблем с ними.

Ниже я попытался до сих пор. (Я пишу необходимую часть кода):

PGresult *res; 
    PGconn *conn; 

    const char *paramValues[12]; 
    int   paramLengths[12]; 
    int   paramFormats[12]; 

    const char* imageFrame=frameImageArray.data();// frameImageArray.data is const char*. 
    int imageSize=frameImageArray.size(); 

    paramFormats[11]=1; 
    paramLengths[11]=imageSize; 
    paramValues[11]= imageFrame; 


// insertplate is a function on db 
    res = PQexecParams(conn, 
    "SELECT insertplate($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)", 
    12,    // param number 
    NULL,   // oid param type 
    paramValues,  // param values 
    paramLengths, // param lengths 
    paramFormats, // params format, 1 for binary 
    1);    //1 for binary result 

Она составлена ​​без проблем, но когда дело доходит до хранения изображений в БД во время выполнения, классическая ошибка выполнения встречается,:

«необработанная исключение в 0x6d3dc220 в ..._ debug.exe: 0xC0000005: местоположение чтения нарушения доступа 0x000000007f91e508. "

Кажется, что-то об управлении памятью.

Независимо от того, что я пробовал, я не мог заставить его работать, и я не могу видеть свою ошибку. Должен ли я использовать Oids для отправки двоичных данных в db с помощью PQexecParams? Или что-то еще мне не хватает? Я очень ценю, если кто-нибудь поможет мне в этом.

Заранее спасибо.

Редактирование: Я просто понял, что если я использую инструкцию Insert, она работает хорошо, но эта функция не работает. Обычно это работает. Weird.

+1

Этот фрагмент кода выглядит отлично. NULL в 'paramTypes' документирован для работы. Я бы искал причину сбоя в других параметрах, предполагая, что 'imageSize' и' imageFrame' верны. Также см. [Этот другой вопрос] (http://stackoverflow.com/questions/8994702) для примера на S.O. –

+0

imageSize и imageFrame являются правильными указателями символов для изображений. На самом деле я делаю то же самое с этим примером, но не работаю. Все еще не мог найти причину. Большое спасибо за ваш интерес кстати. – Horizon1710

ответ

0

Я наконец нашел ошибку.

//paramFormats[0]=0; 
//paramFormats[1]=0; 
//paramFormats[2]=0; 
//paramFormats[3]=0; 
//paramFormats[4]=0; 
//paramFormats[5]=0; 
//paramFormats[6]=0; 
//paramFormats[7]=0; 
//paramFormats[8]=0; 
//paramFormats[9]=0; 
//paramFormats[10]=0; 
//paramFormats[11]=1; 

Можно оставить «формат параметра» как NULL, но я хотел бы установить только «paramFormats [11]», как показано выше. Я также установил остальные 0, и это сработало. Я не ожидал чего-то подобного.