2013-03-14 5 views
0

저는 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 문을 사용하면 잘 작동하지만이 함수는 작동하지 않는다는 것을 알았습니다. 일반적으로 작동합니다. 기묘한.

+1

이 코드 스 니펫이 정상적으로 보입니다. 'paramTypes'의 NULL이 문서화되어 작동합니다. 나는'imageSize'와'imageFrame'가 맞다고 가정하고 다른 매개 변수에서 충돌의 이유를 찾아 볼 것입니다. S.O에 대한 예제는 [이 다른 질문] (http://stackoverflow.com/questions/8994702)을 참조하십시오. –

+0

imageSize 및 imageFrame은 이미지 데이터에 대한 올바른 char 포인터입니다. 실제로 그 예와 똑같은 일을하고 있지만 일하지는 않습니다. 아직도 이유를 찾을 수 없습니다. 관심을 가져 주셔서 감사합니다. – 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로 "매개 변수 형식을"떠날 수 있지만, 나는 위와 같이 볼 만 "[11] paramFormats"로 설정하고 싶었다. 나는 다른 것들도 0으로 설정했고 효과가 있었다. 나는 이런 것을 기대하지 않았다.