解决方案 »

  1.   

    1.下载CppSQLite3U.h与CppSQLite3U.cpp,该类支持Unicode;
    2.例子代码如下:
    #define FILE_DB_NAME    TEXT("unitech.db")//获取程序当前路径
    void GetCurrentDirectory(CString &szPath)
    {
    wchar_t pBuf[256];
    GetModuleFileName(NULL,pBuf,sizeof(pBuf)/sizeof(wchar_t));
    szPath=pBuf;
    szPath = szPath.Left(szPath.ReverseFind('\\')+1);
    }void CDemo2Dlg::OnButton1() 
    {
    CString strDbPath;
    GetCurrentDirectory(strDbPath);
    strDbPath += FILE_DB_NAME; CppSQLite3DB db;
    try
    {
    //打开或新建一个数据库
    db.open(strDbPath); //判断表名是否存在
    if(db.tableExists(L"tblTest"))
    {
    AfxMessageBox(L"Table: tblTest is existed!");
    }
    else //不存在
    {
    AfxMessageBox(L"Table: tblTest not existed!");
    //新建表
    db.execDML(L"create table tblTest(empno varchar(20), empname varchar(20))");
    } //插入一笔记录
    db.execDML(L"insert into tblTest values('编号', '姓名')");
    //插入一笔记录
    db.execDML(L"insert into tblTest values('精瑞电脑', 'Answer')"); //删除一笔记录
    db.execDML(L"delete from tblTest where empno='编号'"); //插入10笔记录(使用事务)
    TCHAR buf[256];
    db.execDML(L"begin transaction;");
    for (int i = 0; i < 10; i++)
    {
    memset(buf, 0, sizeof(buf));
    wsprintf(buf, L"insert into tblTest values ('no%d', 'name%d');", i, i);
    db.execDML(buf);
    }
    db.execDML(L"commit transaction;"); //更新一笔记录
    db.execDML(L"update tblTest set empname='answer' where empno='no1'"); //获取总笔数
    int count = db.execScalar(L"select count(*) from tblTest;");
    TCHAR szCount[50];
    memset(szCount, 0, sizeof(szCount));
    wsprintf(szCount, L"Count:%d", count);
    AfxMessageBox(szCount); //获取每一笔
    CppSQLite3Query q = db.execQuery(L"select * from tblTest");
    while (!q.eof())
    {
    AfxMessageBox(q.fieldValue(0));
    q.nextRow();
    }
    q.finalize(); db.close();
    AfxMessageBox(L"OK");
    }
    catch(CppSQLite3Exception ex)
    {
    AfxMessageBox(ex.errorMessage());
    }
    }
      

  2.   

    Quote: 引用 1 楼 huangbeyond 的回复:

    quote]
    谢谢,封装类找到了。其实我是想知道不用封装类,该怎么解决问题?
      

  3.   

    代码没有,不过最好不用封装类,因为很可能版本一升级就不好使了,得重新改程序,直接用ADO就行了,我就是用ADO操作MYSQL的。但建库时一定要设好字符集,不要数据库建立好后再改字符集(虽然也可能成功),然后MFC程序再用对应的字符集读取及存取数据
      

  4.   

    Quote: 引用 4 楼 hdg3707 的回复:

    ...quote]谢谢,我试试看。
      

  5.   


    你好,VC+ADO+MYSQL我不会使用,能给我一个操作MYSQL封装类,或者是可以提供一下例子或方法吗?谢谢了,万事开头难。好人一生平安!
      

  6.   

    操作sqlite这个数据库,建议还是直接使用其函数,不用什么封装类,简单明了。
    增查删改就用得到几个API函数,控制好Sql语句即可。
    我现在工作中,就使用sqlite,工程包含其头文件和实现文件,可以直接调用API了。
      

  7.   


    你好,VC+ADO+MYSQL我不会使用,能给我一个操作MYSQL封装类,或者是可以提供一下例子或方法吗?谢谢了,万事开头难。好人一生平安!
    http://blog.csdn.net/akof1314/article/details/5937103
      

  8.   

    谢谢,这个类之前已经参考过了,并且已经应用成功了。只是我现在想知道如果直接用API操作的话,在Unicode环境下,怎么操作中文数据才能避免乱码。也就是说,SQLite不支持Unicode,但是支持UTF-8/16等等,我的MFC程序是在Unicode环境下,直接使用API会导致操作中文数据时发生乱码。有什么解决办法?如果解决办法是转换数据类型,那么对于我CString变量中的中文数据,怎么进行转换,然后存入数据库?读取数据的时候,怎么把读出的数据转换为Unicode,以便存放到CString变量中?各位大神,帮帮小弟吧!
      

  9.   


    小弟正是想知道怎么在Unicode环境下用API操作SQLite,遇到了问题。有关问题描述,麻烦看一下我回复8楼版主的内容,希望能帮忙解决,感激不尽!
      

  10.   

    谢谢,这个类之前已经参考过了,并且已经应用成功了。只是我现在想知道如果直接用API操作的话,在Unicode环境下,怎么操作中文数据才能避免乱码。也就是说,SQLite不支持Unicode,但是支持UTF-8/16等等,我的MFC程序是在Unicode环境下,直接使用API会导致操作中文数据时发生乱码。有什么解决办法?如果解决办法是转换数据类型,那么对于我CString变量中的中文数据,怎么进行转换,然后存入数据库?读取数据的时候,怎么把读出的数据转换为Unicode,以便存放到CString变量中?各位大神,帮帮小弟吧!sqlite3 和字符串相关的是char* 。CString封装类,操作是方便,但是不是sqlite3支持的。
    我遇到这种问题,就是,取出来的数据,认为转换成支持中文的编码,将UTF8转换成gb2312
    MultiByteToWideChar, WideCharToMultiByte。
      

  11.   


    小弟正是想知道怎么在Unicode环境下用API操作SQLite,遇到了问题。有关问题描述,麻烦看一下我回复8楼版主的内容,希望能帮忙解决,感激不尽!参考了MSDN和网上的资料,可是这两个函数还不会具体的使用方法,可以讲一下吗,麻烦您了!
      

  12.   

    谢谢,这个类之前已经参考过了,并且已经应用成功了。只是我现在想知道如果直接用API操作的话,在Unicode环境下,怎么操作中文数据才能避免乱码。也就是说,SQLite不支持Unicode,但是支持UTF-8/16等等,我的MFC程序是在Unicode环境下,直接使用API会导致操作中文数据时发生乱码。有什么解决办法?如果解决办法是转换数据类型,那么对于我CString变量中的中文数据,怎么进行转换,然后存入数据库?读取数据的时候,怎么把读出的数据转换为Unicode,以便存放到CString变量中?各位大神,帮帮小弟吧!sqlite3 和字符串相关的是char* 。CString封装类,操作是方便,但是不是sqlite3支持的。
    我遇到这种问题,就是,取出来的数据,认为转换成支持中文的编码,将UTF8转换成gb2312
    MultiByteToWideChar, WideCharToMultiByte。能将一下使用方法吗?谢谢
      

  13.   

    结合你的所说,你在往数据库写入带有中文的宽字符数据时,应将宽字符转换成UTF8格式存入数据库。
    从该数据库中读取含有中文数据时,将UTF8格式反转成宽字符就好了。我这里有宽字符到utf8转换方法,你可以参考一下。至于utf8转成宽字符,主要用到MultiByteToWideChar这个函数。// 宽字符转换成utf8
    const string& WCharToUtf8( const wstring& wstr )
    {
       static string strRet = ""; 
       if ( wstr.empty() )
       {
          return strRet;
       }   int nLen = ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);   char* szUtf8 = NULL;
       szUtf8 = new char[nLen];
       if ( szUtf8 == NULL )
       {
          return (strRet = "" );
       }   memset( szUtf8, 0, nLen );   ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, szUtf8, nLen, NULL, NULL);   strRet = string( szUtf8 );
       if ( szUtf8 != NULL ) { delete [] szUtf8; szUtf8 = NULL; }   return strRet;
    }
      

  14.   

    utf8转换成unicode大体代码//1 获取转换成宽字符后字符串长度
    DWORD dwLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pszSrc, nLen, 0, 0);// 2 分配缓冲区
    DWORD dwBufLen = (dwLen + 1) * sizeof (WCHAR);
    PWCHAR pwszBuf = new WCHAR[dwLen + 1];
    memset (pwszBuf, 0, dwBufLen);// 3 再次调用
    MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pszSrc, nLen, pwszBuf, dwBufLen);// 4 用完 释放内存
    delete [] pwszBuf;
      

  15.   

    谢谢"ponew"仔细耐心的回答我的疑问,您提供的解决办法我已经再调试中,既然是系统API,那么肯定能解决问题。剩下的就交给我吧。结贴了!同样谢谢楼上的各位。