2017-04-08 79 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"; 

这产生了单个char从字符串文字复制的值'S',因为施加到串中的星号字面这样简单地会得到char const[]的第一个字符,并忽略其余字符。

然后您提供char对象的地址SQLite的位置:

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

函数需要char const*作为第二个参数。尽管its documentation没有明确地这样说,但它自然期待指向以空终止的char阵列的指针,而不是指向单个的char

因此,您正在运行到未定义的行为在这里,因为功能不断寻找终止,进入内存不允许访问。

你也是不幸的,因为,而不是崩溃,从而显示你错误所在,什么明显的情况是,一个可访问'\0'恰好在那里在内存中'S'之后。

所以你实际上是传递单个字母“S”作为SQL字符串,并且该函数正确地抱怨。

的治疗很简单:

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

[...]

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

三江源!但是,这样可以修复我列出的第一个问题,但输出第一行的问题仍然存在。有什么方法可以让你知道我该如何解决这个问题? –

+0

@rEbOot:每个问题请注意一个问题/问题/错误! :) Stack Overflow鼓励你为单独的问题提出单独的问题。 –

+0

我必须等待,才能再次发帖。 –