2017-04-08 7 views
2

私は今、SQLite + C++を使っているプロジェクトをしばらくは続けています。今のところ、私のコードは想定されているようにコンソールに何も表示していません。私が得るエラーはsyntax incorrect near "S"です。私のコードは:"S"の近くでSQLite構文が正しくありません

/*Definitions*/ 
sqlite3 *db; 
sqlite3_stmt *statement; 
void *arg; 
char *err; 
const char stmt = *"SELECT * from table"; 
/*End of Definitions*/ 

int exec(void *arg, int argc, char **argv, char **column) { 
    while(true) { 
     int i = 0; 
     for(i < argc;) { 
      cout << column[i] << ": " << argv[i] << endl; 
      i++; 
     } 
     cout << "------" << endl; 
    } 
} 

int main() { 
    int rc = sqlite3_open("test.sqlite", &db); /*Open db "test.sqlite"*/ 
    if(!rc) { 
     sqlite3_exec(db, &stmt, exec, arg, &err); 
    } 
    /*Ending Stuffz (NOTHING BEYOND THIS POINT)*/ 
    cin.get(); 
    return 0; 
} 

データベースにはこの表のデータが含まれていますが、表示されません。私は一点で働いていたが、一行だけ働いて停止した。私は愚かで無視されたバックアップでした、そして今私はそれを修正しようとするとこの混乱に陥っています。どんな助けもありがとうございます。

答えて

2

問題は、この行で開始します:

const char stmt = *"SELECT * from table"; 

アスタリスクは、単純にこのような文字列リテラルに適用されるので、これは、リテラル文字列からコピーされた値'S'を持つ単一charを作成しますchar const[]の最初の文字を取得し、残りは無視します。

はその後、ここでのSQLiteにcharオブジェクトのアドレスを提供する:

sqlite3_exec(db, &stmt, exec, arg, &err); 

関数は2番目の引数としてchar const*を期待しています。 its documentationは明示的にそう言っているわけではありませんが、ヌルで終わるchar配列へのポインタを期待しています。ただ1つではなくcharです。

したがって、'\0'の終端を探し続けるため、未定義の動作にアクセスしています。メモリにアクセスすることはできません。

代わりにクラッシュやエラーがある場合、それによってあなたを示すのか、何が起こる明らかにすることは'\0'アクセスがちょうどいい'S'後にメモリにそこに起こるということですので、あなたは、また不運です。

したがって、実際にという単一の文字「S」をSQL文字列として渡すと、この関数は正しく機能します。

治療法は簡単です:

const char* stmt = "SELECT * from table"; 

[...]

sqlite3_exec(db, stmt, exec, arg, &err); 
+0

ありがとう!しかし、これはリストにある最初の問題を修正しますが、最初の行を出力する問題は依然として続きます。どのように私はこれを修正することができます知っている方法はありますか? –

+0

@rEbOot:問題ごとに1つの問題/問題/バグをください! :) Stack Overflowでは、別々の質問をすることを奨励しています。 –

+0

私は再び投稿できるようになるまで待つ必要があります。 –

関連する問題