你用什么读写MySQL?VC一般是用C API吧。
mysql_query(&m_mysql,"set names \'GBK\'")
你公司的要求就是读取数据库的内容并显示出来?
如果你之前没用VC写过读写MySQL的程序的话最好看下MySQL的开发文档。下面代码是从我的代码里面找的一部分读写数据库的。
通过C API连接数据库分为初始化、设置选项、连接到数据库3步:
MYSQL mysql// 数据库句柄
MYSQL *pmysql// 验证连接用句柄
// 初始化数据库
if (mysql_init(&mysql) == NULL)
{
// 初始化数据库错误
return
}
// 设置MySQL选项
mysql_options(&m_mysql,MYSQL_READ_DEFAULT_GROUP,"IMServer")
// 连接到数据库
// mysql_real_connect(数据库句柄,主机名,用户名,密码,数据库名,端口,命名管道,客户端标记)
pmysql = mysql_real_connect(&m_mysql,"localhost","root",NULL,"imdb",3306,NULL,0)
// 检测是否连接成功
if (pmysql == &m_mysql)
{
// 连接失败
return
}
如果连接成功,就可以进行数据库的读写了:
读写方式就跟平常查询数据库一样,返回的结果放在一个结果集变量中。
步骤是:
1.mysql_query()提交查询语句
2.mysql_use_result()获取上一次查询的结果集
3.mysql_fetch_row()从结果集中获取单项内容
4.mysql_free_result()释放结果集
下面的例子查询表imdb_users中UserID为abc的条目:
假设前面已经连接到了数据库,句柄为mysql
///////////////////////
MYSQL_RES *result // 存放结果集
MYSQL_ROW row // 存放结果集中单个条目
unsigned long *nLength // 存放结果字段的长度
char ch_query[100] // 存放ANSI查询语句
// 查询语句
CString strQuery = L"select * from imdb_users where UserID = \'abc\'"
// 用前面说的封装API的函数将查询语句转换为ANSI
UnicodeToAnsi(ch_query,strQuery)
// 提交查询语句
if(mysql_query(&mysql,ch_query)!=0)
{
// 查询出错,返回
return
}
// 读取结果集
if(!(result=mysql_use_result(&m_mysql)))
{
// 读取结果集失败
return
}
// 获取查询到的表的每列的信息
if ((row=mysql_fetch_row(result)) == NULL)
{
// 没有找到数据
mysql_free_result(result) // 释放结果集内存
return
}
// 获取结果字段的长度
nLength = mysql_fetch_lengths(result)
// 获取结果集中第一个字段的内容
WCHAR wsz[100]
MultiByteToWideChar(CP_ACP,0,row[1],nLength[1]+1,wsz,sizeof(wsz))
// 显示内容
CString str
str.Format(L"%s",wsz)
AfxMessageBox(str)
mysql_free_result(result)// 释放结果集内存
===============================================
我以前也碰到了这个问题。
我看了下之前的代码,但不记得哪些代码是用来解决这个问题了。
大概是先要
mysql_query(&m_mysql,"set names \'GBK\'")
设置查询用的编码,我这用的GBK。
这样返回的结果集的编码跟数据库的编码就一样了。这样一来得到的字符串应该不是问号,而是乱码了。
然后很重要的一点,要根据你程序使用的编码决定是否要转换字符。如果你的程序使用了Unicode,要么就一定要进行转换,我之前搞了半天只获得了第一个字符,后来才觉得是Unicode的问题。因为MySQL返回的字符是单字节,Unicode是双字节,直接显示肯定不匹配。转换是用MultiByteToWideChar()和WideCharToMultiByte()这两个Windows API,前者ANSI >Unicode, 后者Unicode >ANSI。
ANSI >Unicode:
WCHAR ch[200]
MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,ch,sizeof(ch))
===============================================
Unicode >ANSI:
// 将CString的内容转换为ANSI
void DbProcess::UnicodeToAnsi( char *pstr, CString str )
{
WCHAR *pwtrQuery
pwtrQuery = (WCHAR *)(LPCTSTR)str
WideCharToMultiByte(CP_ACP,0,pwtrQuery,-1,pstr,strlen(pstr),NULL,NULL)
}
使用方法:
char ch[200]
CString str = L"Unicode charactor"
UnicodeToAnsi(ch, str)
mysql用c和c++写的,你在make的时候需要c的库去下载这两个包,
libncurses5-dev
libmysqlclient15-dev
这是因为UTF8编码格式的问题,你需要进行字符转换。首先用MultiByteToWideChar(CP_UTF8,0,lpszBuffer,-1,(LPWSTR)pUnicode,size)把UTF8转成宽字节文字,
然后用WideCharToMultiByte(936,0,(LPWSTR)pUnicode,-1,lpszContext,size,NULL,NULL)转换成CP936编码的中文汉字。
只能帮你找个思路,具体的函数调用细节我也不计啦,自己查win32api的手册吧。可以参考下面的例子。
VC6.0 UCS2(unicode) 与 GBK(gb2312) UTF(utf-8)格式互转
#include <string>
#include <stdio.h>
#include "windows.h"
// 把UTF-8转换成Unicode
void UTF_8ToUnicode(WCHAR* pOut,char *pText)
{
char* uchar = (char *)pOut
uchar[1] = ((pText[0] &0x0F) <<4) + ((pText[1] >>2) &0x0F)
uchar[0] = ((pText[1] &0x03) <<6) + (pText[2] &0x3F)
return
}
// Unicode 转换成UTF-8
void UnicodeToUTF_8(char* pOut,WCHAR* pText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
char* pchar = (char *)pText
pOut[0] = (0xE0 | ((pchar[1] &0xF0) >>4))
pOut[1] = (0x80 | ((pchar[1] &0x0F) <<2)) + ((pchar[0] &0xC0) >>6)
pOut[2] = (0x80 | (pchar[0] &0x3F))
return
}
// 把Unicode 转换成 GB2312
void UnicodeToGB2312(char* pOut,unsigned short uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL)
return
}
// GB2312 转换成 Unicode
void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1)
return
}
//GB2312 转为 UTF-8
void GB2312ToUTF_8(CString&pOut,char *pText, int pLen)
{
char buf[1024]
char* rst = new char[pLen + (pLen >>2) + 2]
memset(buf,0,1024)
memset(rst,0,pLen + (pLen >>2) + 2)
int i = 0
int j = 0
while(i <pLen)
{
//如果是英文直接复制就可以
if( *(pText + i) >= 0)
{
rst[j++] = pText[i++]
}
else
{
WCHAR pbuffer
Gb2312ToUnicode(&pbuffer,pText+i)
UnicodeToUTF_8(buf,&pbuffer)
unsigned short int tmp = 0
tmp = rst[j] = buf[0]
tmp = rst[j+1] = buf[1]
tmp = rst[j+2] = buf[2]
j += 3
i += 2
}
}
strcpy(&rst[j],"\0")
//返回结果
pOut = rst
delete []rst
return
}
//UTF-8 转为 GB2312
void UTF_8ToGB2312(CString &pOut, char *pText, int pLen)
{
char * newBuf = new char[pLen]
char Ctemp[4]
memset(Ctemp,0,4)
int i =0
int j = 0
while(i <pLen)
{
if(pText[i] >0)
{
newBuf[j++] = pText[i++]
}
else
{
WCHAR Wtemp
UTF_8ToUnicode(&Wtemp,pText + i)
UnicodeToGB2312(Ctemp,Wtemp)
newBuf[j] = Ctemp[0]
newBuf[j + 1] = Ctemp[1]
i += 3
j += 2
}
}
strcpy(&newBuf[j],"\0")
pOut = newBuf
delete []newBuf
return
}
CString UTF8_Encode(LPTSTR strUnicode)
{
long TLen
CString UTF8_EncodeLong
TLen = CString(strUnicode).GetLength()
if(TLen == 0)
{
return CString(strUnicode)
}
long lngBufferSize
long lngResult
//Set buffer for longest possible string.
lngBufferSize = TLen * 3 + 1
char *bytUtf8 = new char[lngBufferSize]
//Translate using code page 65001(UTF-8).
lngResult = WideCharToMultiByte(CP_UTF8, 0, (unsigned short*)strUnicode, TLen, bytUtf8, lngBufferSize, NULL, 0)
bytUtf8[lngResult] = NULL
return CString(bytUtf8)
}
/*************************************************************************/
CString URLEncode(CString sIn)
{
CString sOut
const int nLen = sIn.GetLength() + 1
register LPBYTE pOutTmp = NULL
LPBYTE pOutBuf = NULL
register LPBYTE pInTmp = NULL
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen)
BYTE b = 0
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2)//new BYTE [nLen * 3]
if(pOutBuf)
{
pInTmp = pInBuf
pOutTmp = pOutBuf
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp))
*pOutTmp++ = *pInTmp
else
if(isspace(*pInTmp))
*pOutTmp++ = '+'
else
// if(*pInTmp<=127)
// *pOutTmp++ = *pInTmp
// else
{
*pOutTmp++ = '%'
*pOutTmp++ = toHex(*pInTmp>>4)
*pOutTmp++ = toHex(*pInTmp%16)
}
pInTmp++
}
*pOutTmp = '\0'
//sOut=pOutBuf
//delete [] pOutBuf
sOut.ReleaseBuffer()
}
sIn.ReleaseBuffer()
return sOut
}
使用///////////////////////////////////
CString memname=“汉字"
GB2312ToUTF_8(memname,mem_name,TCBUFSIZE)
URLEncode(memname)便是所要的结果"“%E6%B1%89%E5%AD%97"了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)