我正在尝试重新编写一个我想要处理的个人项目的编程但是我无法搞清楚sqlite3 c / c ++ api。我正在修改我在各种教程中找到的代码片段,并且我试图让它们从数据库中返回数据和字段名称。以下是我遇到困难的代码部分:
sqlite3 *db;
sqlite3_stmt *ppStmt;
int col_num;
char *zErrMsg = 0;
const char *zSql = "SELECT ?,? FROM basic_table";
string s = "Field1";
string t = "Field2";
rc = sqlite3_prepare_v2(db,zSql,-1,&ppStmt,0);
sqlite3_bind_text(ppStmt,1,s.c_str(),s.length(),SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt,2,t.c_str(),t.length(),SQLITE_TRANSIENT);
if(rc)
{
cerr << "SQL error: " << sqlite3_errmsg(db) << endl;
}
else
{
col_num = sqlite3_column_count(ppStmt);
do
{
rc = sqlite3_step(ppStmt);
switch(rc)
{
case SQLITE_DONE:
break;
case SQLITE_ROW:
for( int i=0; i<col_num; i++)
{
cout << sqlite3_column_name(ppStmt, i) << " " <<
sqlite3_column_text(ppStmt,i) << endl;
}
break;
default:
cerr << "Inside error " << sqlite3_errmsg(db) << endl;
break;
}
} while( rc==SQLITE_ROW );
sqlite3_finalize(ppStmt);
column_name返回正确的值,但数据只返回一个问号。我可以通过使用回调函数调用sqlite3_exec来获取代码,但sqlite3的文档建议使用sqlite3_prepare_v2,sqlite3_bind,sqlite3_step和sqlite3_finalize而不是此方法,所以我只是想看看我是否可以使用该方法。我正在制作一个简单的错误吗?任何建议将不胜感激。
答案 0 :(得分:0)
这些列的名称是?
,因为这是他们在查询中的写法。
这些列的值是Field1
和Field2
,因为您告诉数据库您希望SELECT返回这些字符串值。
数据库按设计工作。
Parameters只能用于替换表达式的值;您不能使用它们来替换列/表名等标识符。 您必须直接在SQL语句中编写列名:
const char *zSql = "SELECT Field1, Field2 FROM basic_table";