数据库 sqlite3_get_table,sqlite3_free_table

sqlite入门基础(二):sqlite3_get_table,sqlite3_free_table

 http://www.cnblogs.com/likebeta/archive/2012/06/17/2552784.html

 

达同首介绍的sqlite3_exec
是选拔回调来施行对select结果的操作。还有一个智可以直接询问而非待回调。但是,我个人感觉仍旧回调好,因为代码可以更加整齐,只但是用回调很麻烦,你得阐明一个函数,假使此函数是近似成员函数,你还不得不把它注明成static的(要咨询为啥?这又是C++基础了。C++成员函数实际上隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把看似指针当成函数的第一只参数传递进去。结果,那招和前面说之sqlite
回调函数的参数不称。只有当把成员函数讲明成static
时,它才没有剩余的带有的this参数)。
虽回调显得代码整齐,但有时候你要想只要无回调的select
查询。这得透过sqlite3_get_table 函数做到。

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result);

第1个参数不再多说,看前面的事例。
第2独参数是sql 语句,跟sqlite3_exec 里之sql
是一致的。是一个不胜常见的以\0结尾的char*字符串。
第3独参数是询问结果,它仍然一维数组(不要看是二维数组,更不用当是三维数组)。它内存布局是:字段名称,后面是随后是每个字段的值。下边用例子来说事。
第4个参数是询问有些许条记下(即查出多少行,不包字段名这行)。
第5个参数是稍微只字段(多少排列)。
第6独参数是错误信息,跟前边一样,这里不多说了。

pazResult再次来到的字符串数量其实是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个凡是许段名

改达篇的事例,使用sqlite3_get_table,来去的结果集:

#include <iostream>
using namespace std;
#include "sqlite/sqlite3.h"
int callback(void*,int,char**,char**);
int main()
{
    sqlite3* db;
    int nResult = sqlite3_open("test.db",&db);
    if (nResult != SQLITE_OK)
    {
        cout<<"打开数据库失败:"<<sqlite3_errmsg(db)<<endl;
        return 0;
    }
    else
    {
        cout<<"数据库打开成功"<<endl;
    }

    char* errmsg;

    nResult = sqlite3_exec(db,"create table fuck(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
     if (nResult != SQLITE_OK)
     {
         sqlite3_close(db);
         cout<<errmsg;
         sqlite3_free(errmsg);
        return 0;
    }
    string strSql;
    strSql+="begin;\n";
    for (int i=0;i<100;i++)
    {
        strSql+="insert into fuck values(null,'heh');\n";
    }
    strSql+="commit;";
    //cout<<strSql<<endl;

    nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);

    if (nResult != SQLITE_OK)
    {
        sqlite3_close(db);
        cout<<errmsg<<endl;
        sqlite3_free(errmsg);
        return 0;
    }

    strSql = "select * from fuck";
    //nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);
    char** pResult;
    int nRow;
    int nCol;
    nResult = sqlite3_get_table(db,strSql.c_str(),&pResult,&nRow,&nCol,&errmsg);
      if (nResult != SQLITE_OK)
    {
        sqlite3_close(db);
        cout<<errmsg<<endl;
        sqlite3_free(errmsg);
        return 0;
    }

    string strOut;
    int nIndex = nCol;
    for(int i=0;i<nRow;i++)
    {
        for(int j=0;j<nCol;j++)
        {
            strOut+=pResult[j];
            strOut+=":";
            strOut+=pResult[nIndex];
            strOut+="\n";
            ++nIndex;
        }
    }
    sqlite3_free_table(pResult);
    cout<<strOut<<endl;
    sqlite3_close(db);
    return 0;
}
/*
int callback(void* ,int nCount,char** pValue,char** pName)
{
    string s;
    for(int i=0;i<nCount;i++)
    {
        s+=pName[i];
        s+=":";
        s+=pValue[i];
        s+="\n";
    }
    cout<<s<<endl;
    return 0;
}*/
网站地图xml地图