[완료] sqlite3 C API bind 관련 문제입니다.

ks1167의 이미지

안녕하세요~ ^^

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;
}

feanor의 이미지

bind를 테이블명이나 컬럼명으로 사용할 수 없습니다.

ks1167의 이미지

가차 없는 단칼이군요............ -_ㅠ

sql2의 이미지

저도 예전에 그런 생각을 해본 적이 있었죠.

파라미터 바인딩으로 모든 것을 해결하리라...

"SELECT ? FROM ? WHERE ? = ?"

무엇을 ? 어떻게 ? ...

결국 필요한 기본적인 정보( 컬럼명, 테이블명 )가 없다면 쿼리플랜을 만들 수 없습니다.

파서를 수정해서 지원하도록 하더라도 결국 prepare 이점이 전혀 없는거죠.

익명 사용자의 이미지

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 );
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.