2012-02-04 25 views
0

零個項目我打電話如何返回SQLite中

sqlite3_exec(db, "SELECT a,b,Z FROM t1 WHERE t1.id = 1", func_ptr, arg_ptr) 

收集行內容和列名的select操作過程中得到的列名。我試圖創建一個通用的幫助函數,該函數將接受任何SELECT命令,並構造一個vector<vector<string>>,第一行包含列名稱(其餘包含行的內容)。

但是由於func_ptr只有一行或多行才能被調用顯示,所以當沒有行顯示時,這將無法捕獲列名。

如何在SELECT返回零行時獲取列名? 編輯:我不希望通過創建一個表,然後在該表上調用SELECT來創建間接級別。謝謝。 編輯:我只想收集什麼SELECT聲明包含。

回答

2

您可以使用PRAGMA table_info(tablename);來獲取包含給定表的列名和類型的結果集。

與普通查詢一樣調用編譯指示(例如,使用sqlite3_exec)。

如果您不需要自己生成的包含列選擇的SQL語句需要此信息,則需要使用準備好的語句(無論如何您都應該這樣做)。然後,您可以使用sqlite3_column_countsqlite3_column_name來獲取您之後的信息。

用法示例:

sqlite3_stmt *stmt; 
rc = sqlite3_prepare_v2(db, "select a,b from t where 0=1", -1, &stmt, 0); 
if(rc!=SQLITE_OK){ 
    fprintf(stderr, "SQL error: %s\n", zErrMsg); 
    sqlite3_free(zErrMsg); 
} 

int cols = sqlite3_column_count(stmt); 
fprintf(stdout, "%d columns\n", cols); 
for (int i=0; i<cols; i++) 
    fprintf(stdout, "%d. %s\n", i, sqlite3_column_name(stmt, i)); 

// iterate over the results with sqlite3_step 
// dispose of the statement with sqlite3_finalize 

可以適應這列名保存在std::vector

+0

這是否意味着我必須先創建一個表?例如。 CREATE TABLE tablename AS SELECT ... – jobobo 2012-02-04 08:02:20

+0

不,您在示例中使用'pragma table_info(t1)',您不需要再創建任何東西。 – Mat 2012-02-04 08:03:28

+0

對不起,不是一個明確的問題。如何使用SELECT a,b,z FROM t1 ...這是SELECT命令只描述了我感興趣的列,因此pragma table_info(t1)將返回所有列名稱,而不是自定義SELECT命令中的內容。謝謝。 – jobobo 2012-02-04 08:06:46