[완료] sqlite3 C API bind 관련 문제입니다.
안녕하세요~ ^^
C API로 sqlite3 에서
prepare // bind_text // step // colum_text // finalize
함수를 이용해서 DB 내용을 변수에 담는 내용입니다.
바인드를 할수 있는 내용이 정해져 있는건지 궁금한 것입니다.
여느 예제를 보아도 바인드 하려는 내용이 값 들 이더라구요
즉, 테이블 명이나.. colum명은 적용이 안될까요?;;
prepare 에서 준비된 쿼리를
char *sql = "select value FROM kstable WHERE name=?";
이렇게 준비하고
char *n0 = "KS";
sqlite3_bind_text(stmt, 1, n0, -1, SQLITE_STATIC);
char *ans = sqlite3_column_text(stmt, 0);
printf("ans=%s\n", ans);
문제 없이 잘 됩니다.
이제 궁금점이 bind를 쿼리문 중 text에 적용하려고 생각했거든요
예를 들면
1) select ? FROM kstable WHERE name=? 이런식이나
2) select value FROM ? WFERE name=? 이런식으로..
넣어서 bind를 두개로 두고.. 해보면.. 영 안되더라구요
1)의 경우 첫 ? -> "value" 두번째 ? -> "KS" 로 바인드하고
처음 잘되었던 쿼리와 같다고 생각한다면 같은 결과가 나와야 할텐데..
결과 ans값이 value 가 찍히네요.. 첫바인드한 text가 찍혔습니다.;
2)의 경우 마찬가지로 테이블명은 스트링으로 갖는 변수를 바인드 시켜주고
실행했더니 char *ans = sqlite3_column_text(stmt, 0); 값을 가져오는
이 문장에서 세그먼트 오류가 발생했습니다.;;;
bind를 테이블명이나 컬럼명으로는 사용못할까요;?
================= test code =================
#include
#include
#include "sqlite3.h"
#define DB_NAME "ks_db"
int main()
{
char *ErrMsg = 0;
sqlite3_stmt *stmt;
sqlite3 *db = NULL;
while ((sqlite3_open(DB_NAME, &db)) != SQLITE_OK )
{
printf("sqlite3_DB is not open yet");
}
char *name = "KS"; // test 변수
char *value = "*"; // test 변수
char *sql = "select value FROM 테이블명 WHERE name=?"; // test query
// char *sql = "select value FROM ? WHERE name=?"; // test query
const unsigned char *ans;
printf("name=%s\n", name);
printf("value=%s\n", value);
sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
// sqlite3_bind_text(stmt, 1, value, -1, SQLITE_STATIC); // test bind arg2 1 or 2
sqlite3_bind_text(stmt, 1, name, -1, SQLITE_STATIC); // test bind arg2 1 or 2
sqlite3_step(stmt);
ans = sqlite3_column_text(stmt, 0);
sqlite3_finalize(stmt);
printf("ans=%s\n", ans);
sqlite3_close(db);
return 0;
}
안됩니다
bind를 테이블명이나 컬럼명으로 사용할 수 없습니다.
열심히 했는데..
가차 없는 단칼이군요............ -_ㅠ
저도...
저도 예전에 그런 생각을 해본 적이 있었죠.
파라미터 바인딩으로 모든 것을 해결하리라...
"SELECT ? FROM ? WHERE ? = ?"
무엇을 ? 어떻게 ? ...
결국 필요한 기본적인 정보( 컬럼명, 테이블명 )가 없다면 쿼리플랜을 만들 수 없습니다.
파서를 수정해서 지원하도록 하더라도 결국 prepare 이점이 전혀 없는거죠.
Inserting
memProc->Lines->Append( L"\t Inserting... \n" );
AnsiString strQuery = "INSERT INTO TestTable (name, age, country) VALUES (?, ?, ?);";
if (sqlite3_prepare_v2( pSQLite3, strQuery.c_str(), strQuery.Length(), &pStmt, &szErr ) == SQLITE_OK ) {
for ( int i = 0; i < 10; ++i ) {
AnsiString strName;
strName.sprintf( "name%d", i);
sqlite3_bind_text( pStmt, 1, strName.c_str(), strName.Length(), NULL);
sqlite3_bind_int( pStmt, 2, i);
AnsiString strCountry;
sqlite3_bind_text( pStmt, 3, strCountry.c_str(), strCountry.Length(), NULL);
sqlite3_step( pStmt );
int nLast = sqlite3_last_insert_rowid( pSQLite3 );
strMsg.sprintf( L"\t\t Inserted... OK (%d)\n", nLast );
memProc->Lines->Append( strMsg );
sqlite3_reset( pStmt );
}
sqlite3_finalize( pStmt );
}
댓글 달기