저는 C로 코딩하고 Postgresql의 Libpq 라이브러리를 사용하며 "bytea"유형의 데이터베이스에 PNG 이미지를 저장하려고합니다. 나는 그물을 수 시간 동안 찾고 있었으므로이 작품을 다루기에 좋은 모범을 찾을 수 없었으므로 여기에 글을 쓰고 도움을 요청하고 싶었다.libpq 라이브러리가있는 postgresql db의 bytea 열로 이미지를 전송하는 중 오류가 발생했습니다.
저는 바인딩 할 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
그것은 문제없이 컴파일하지만 런타임에 dB로 이미지를 저장할 때, 고전적인 런타임 오류가 occures : (I 코드의 필요한 부분을 쓰고 있어요)
"처리되지 않은를 ... debug.exe에서 0x6d3dc220 예외 : 0xC0000005 : 액세스 위반 읽기 위치 0x000000007f91e508. "
메모리 처리와 관련이 있습니다.
내가 시도한 것은 무엇이든 실행할 수 없으며 실수를 볼 수 없습니다. PQexecParams가있는 DB에 바이너리 데이터를 보내기 위해 OID를 사용해야합니까? 아니면 내가 놓친 다른 것? 누군가가 이걸 도와 주면 정말 고맙습니다.
미리 감사드립니다.
편집 : Insert 문을 사용하면 잘 작동하지만이 함수는 작동하지 않는다는 것을 알았습니다. 일반적으로 작동합니다. 기묘한.
이 코드 스 니펫이 정상적으로 보입니다. 'paramTypes'의 NULL이 문서화되어 작동합니다. 나는'imageSize'와'imageFrame'가 맞다고 가정하고 다른 매개 변수에서 충돌의 이유를 찾아 볼 것입니다. S.O에 대한 예제는 [이 다른 질문] (http://stackoverflow.com/questions/8994702)을 참조하십시오. –
imageSize 및 imageFrame은 이미지 데이터에 대한 올바른 char 포인터입니다. 실제로 그 예와 똑같은 일을하고 있지만 일하지는 않습니다. 아직도 이유를 찾을 수 없습니다. 관심을 가져 주셔서 감사합니다. – Horizon1710