2013-06-05 1 views
1

약점이있는 문자열 조작으로 테이블의 레코드를 업데이트 할 수 있습니다.
이제 매개 변수로 업데이트하려고합니다. 그러나 이것은 생각하지 않습니다.PostgreSQL, libpq/C, 업데이트 매개 변수

sprintf(sql, "%s%s%s%s%s%d%s", 
    "UPDATE ", mytable, " SET ", 
    "my_id=$0, mystr1=$1, mystr2=$2, myint=$3, mydouble=$4", 
    "WHERE my_id='", local_my_id, "'"); 

const char *values[5] = 
{local_my_id, local_mystr1, local_mystr2, local_myint, local_mydouble}; 

result = PQexecParams(conn, sql, 5, NULL, values, NULL, NULL, 0); 

값 1과 4는 정수이며 값 5는 const를 char 배열에 맞지 않는 것을 두 배이다.
나는 문자열만으로도 같은 것을 시도하고 작동합니다.

숫자를 논리적으로 보이지 않는 문자열로 변환해야하는 경우.

올바르게 수행하는 방법은 무엇입니까?

답변

2

숫자를 문자열로 변환해야하는 것은 논리적으로 보일지 모르겠지만 기본 "텍스트"프로토콜을 사용하는 경우 정확히 수행해야합니다. 이 세부 사항을 많이 다루는 the libpqtypes library을 사용해보십시오.

바이너리 프로토콜 (param-by-param 기준으로 PQexecParams의 설명서 참조)을 사용할 수 있지만 일반적으로 텍스트 프로토콜을 사용하는 것이 좋습니다. 네트워크에서 종종 실제로 더 빠르며, 특히 작은 숫자가 많은 경우에 그렇습니다. 텍스트 프로토콜을 사용하면 엔디안 및 숫자 형식 문제에 대해 걱정할 필요가 없습니다.

+0

나는 본다. 이 상황에서 libpqtypes는 매우 매력적입니다. 나는 컴파일하려고하지만 할 수 없다. 이 라이브러리의 Windows 바이너리를 다운로드 할 곳이 있습니까? –

+0

@ user973238 아, Windows에 있습니다. 장난. 나는 아직 Windows에서'libpqtypes'를 사용할 필요가 없으므로 여러분 자신 만의 것이됩니다. 적절한 검색을 한 후에 아무것도 찾지 못하면 메일 링리스트에 질문하거나 새로운 SO 질문을 게시하는 것을 고려하십시오. –