sql,mysql。存入泰文问题,急,急,急!

yaowei5555 2008-04-10 05:04:07
请问如何在unicode环境下将泰文写入sql nvarchar类型字段?以及如何在mysql中存取unicode数据,,前几天将中文,韩文,日文等存入sql nvarchar类型字段问题已解决,但存入泰语时存入的却是?????号,望大虾们指教!
...全文
658 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaowei5555 2008-04-12
  • 打赏
  • 举报
回复
先在那上面划红线的部门去掉,继承cdatabase类,构筑一个新的类,void CDatabaseEx::ExecuteSQLW(LPWSTR lpszSQL)
{
RETCODE nRetCode;
HSTMT hstmt;

ASSERT_VALID(this);
ASSERT(AfxIsValidString(lpszSQL));

AFX_SQL_SYNC(::SQLAllocStmt(m_hdbc, &hstmt));
if (!CheckHstmt(nRetCode, hstmt))
AfxThrowDBException(nRetCode, this, hstmt);

TRY
{
OnSetOptions(hstmt);

// Give derived CDatabase classes option to use parameters
BindParameters(hstmt);

AFX_ODBC_CALL(::SQLExecDirectW(hstmt,lpszSQL, SQL_NTS));

if (!CheckHstmt(nRetCode, hstmt))
AfxThrowDBException(nRetCode, this, hstmt);
else
{
do
{
SWORD nResultColumns;

AFX_ODBC_CALL(::SQLNumResultCols(hstmt, &nResultColumns));
if (nResultColumns != 0)
{
do
{
AFX_ODBC_CALL(::SQLFetch(hstmt));
} while (CheckHstmt(nRetCode, hstmt) &&
nRetCode != SQL_NO_DATA_FOUND);
}
AFX_ODBC_CALL(::SQLMoreResults(hstmt));
} while (CheckHstmt(nRetCode, hstmt) &&
nRetCode != SQL_NO_DATA_FOUND);
}
}
CATCH_ALL(e)
{
::SQLCancel(hstmt);
AFX_SQL_SYNC(::SQLFreeStmt(hstmt, SQL_DROP));
THROW_LAST();
}
END_CATCH_ALL

AFX_SQL_SYNC(::SQLFreeStmt(hstmt, SQL_DROP));
}
才你正常写入
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
void CDatabase::ExecuteSQL(LPCWSTR lpszSQL)
{
USES_CONVERSION;
RETCODE nRetCode;
HSTMT hstmt;

ASSERT_VALID(this);
ASSERT(AfxIsValidString(lpszSQL));

AFX_SQL_SYNC(::SQLAllocStmt(m_hdbc, &hstmt));
if (!CheckHstmt(nRetCode, hstmt))
AfxThrowDBException(nRetCode, this, hstmt);

TRY
{
OnSetOptions(hstmt);

// Give derived CDatabase classes option to use parameters
BindParameters(hstmt);

AFX_ODBC_CALL(::SQLExecDirect(hstmt,
(UCHAR*)T2A((LPTSTR)lpszSQL), SQL_NTS));

if (!CheckHstmt(nRetCode, hstmt))
AfxThrowDBException(nRetCode, this, hstmt);
else
{
do
{
SWORD nResultColumns;

AFX_ODBC_CALL(::SQLNumResultCols(hstmt, &nResultColumns));
if (nResultColumns != 0)
{
do
{
AFX_ODBC_CALL(::SQLFetch(hstmt));
} while (CheckHstmt(nRetCode, hstmt) &&
nRetCode != SQL_NO_DATA_FOUND);
}
AFX_ODBC_CALL(::SQLMoreResults(hstmt));
} while (CheckHstmt(nRetCode, hstmt) &&
nRetCode != SQL_NO_DATA_FOUND);
}
}
CATCH_ALL(e)
{
::SQLCancel(hstmt);
AFX_SQL_SYNC(::SQLFreeStmt(hstmt, SQL_DROP));
THROW_LAST();
}
END_CATCH_ALL

AFX_SQL_SYNC(::SQLFreeStmt(hstmt, SQL_DROP));
}

// Shutdown pending query for CDatabase's private m_hstmt
void CDatabase::Cancel()
{
ASSERT_VALID(this);
ASSERT(m_hdbc != SQL_NULL_HDBC);

::SQLCancel(m_hstmt);
}
上面那个是这个函数里面用到的,我按你的改了好像也没用啊
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
(UCHAR*)T2A((LPTSTR)lpszSQL), SQL_NTS))错了
(wchar *)T2A((LPCWTR)lpszSQL), SQL_NTS))试一下
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
(UCHAR*)T2A((LPTSTR)lpszSQL), SQL_NTS))?这是要做什么?
用(wchar *)T2A((LPTWTR)lpszSQL), SQL_NTS))试一下。
SQL_NTS告诉函数计算0结尾的字符串长度,你的那句话给截断了。
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
在查询分析器里面执行插入泰文的语句可以正常得到泰文啊,应该说明和sql没有多大的关系,是不是在格式化和执行插入的时候写错了,或者还应该做什么转换才行
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
MessageBox(str,_T("显示"),MB_OK); 能够正常显示泰文,为什么插入到数据库就不行了了,是不是在执行db.ExecuteSQL()函数调用了 (UCHAR*)T2A((LPTSTR)lpszSQL), SQL_NTS))把unicode换成了ANSI???
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
哦,请问如何查看strSQL是否争取??
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
http://www.dezai.cn/life_Show.asp?ArticleID=22106&ArticlePage=1 看这篇文章能不能帮上你
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yaowei5555 的回复:]
明哥可否留下联系方式QQ或邮箱,在这里等你太慢了,多谢了,这个问题困扰太久了,上次可以输入中,日,韩还以为搞定了,就结贴了,结果碰到泰文又不行了
[/Quote]
别等我,呵呵。我只是给你建议而已。具体问题所在我也不清楚,只是你应当排除所以可能潜在的引起错误的因素,才能找出真正
问题所在。你按照8楼修改一下,看看strSQL是否正确 ,db.ExecuteSQL(bstrSQL); 是否成功。
ps:我在上班,偶尔上来看看。公司无法上邮箱qq。抱歉。祝你早日解决
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
明哥可否留下联系方式QQ或邮箱,在这里等你太慢了,多谢了,这个问题困扰太久了,上次可以输入中,日,韩还以为搞定了,就结贴了,结果碰到泰文又不行了
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yaowei5555 的回复:]
sql版本是2000的,但的查询分析器里执行代码可显示泰文,我是把一个Cstring 类型写入
CString str(Buffer);
MessageBox(str,_T("显示"),MB_OK);
try
{
CDatabase db;
if(db.OpenEx((_T("dsn=s8200;uid=root;pwd=root"))))
{
CString strSQL=L"";
strSQL.Format(_T("INSERT INTO a_factory VALUES(10,'EV8000',1,'湖北宜昌','%s','张sir')"), str);
_bstr_t bstrSQL(strSQL);
db.ExecuteSQL(bstrSQL);

[/Quote]
不要用_T全部用L包括''
strSQL.Format(_T("INSERT INTO a_factory VALUES(10,'EV8000',1,'湖北宜昌','%s','张sir')"), str);
之后输出一下strSQL看看结果是否正确
执行db.ExecuteSQL(bstrSQL); 的时候
try catch看是否成功
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
Why no man tell me????
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
sql版本是2000的,但的查询分析器里执行代码可显示泰文,我是把一个Cstring 类型写入
CString str(Buffer);
MessageBox(str,_T("显示"),MB_OK);
try
{
CDatabase db;
if(db.OpenEx((_T("dsn=s8200;uid=root;pwd=root"))))
{
CString strSQL=L"";
strSQL.Format(_T("INSERT INTO a_factory VALUES(10,'EV8000',1,'湖北宜昌','%s','张sir')"), str);
_bstr_t bstrSQL(strSQL);
db.ExecuteSQL(bstrSQL);
}
messagebox中能够显示泰文,是不是格式化的时候搞错了?我是在vc 设置unicode环境下进行写入数据库的,好像后来mfc里有个自动函数又将unicode该为了ansi了,所以存入的是????,望高人们指点啊
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
SQLExecDirect返回值正确吗?
日语,韩语,用相同的方法都能成功吗?
只有泰语不可以?
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
红色的部门我改成你所说的那样也不行啊,
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
AFX_ODBC_CALL(::SQLExecDirect(hstmt,
(UCHAR*)T2A((LPTSTR)lpszSQL), SQL_NTS)); 红色部分你改成什么了?
SQLExecDirect看返回值。仔细分析一下。
yaowei5555 2008-04-11
  • 打赏
  • 举报
回复
怎么没有人解答啊??
ryfdizuo 2008-04-10
  • 打赏
  • 举报
回复
google找找看吧。
Supper_Jerry 2008-04-10
  • 打赏
  • 举报
回复
sql 那个版本?2005支持的。
加载更多回复(2)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧