1

嗨,我对数据库完全陌生。在这里,我在向表中插入一行时遇到问题。输入的字符串是 Unicode 格式,并使用WideCharToMultiBytecall 转换为 UTF8。然后构造一个数据库查询,如下所示。

in = "Weiß" (UTF8 string result of conversion from Unicode to UTF8)


wchar_t buf[2048]; //= new wchar_t[ in.size() ];
size_t num_chars = mbstowcs( buf, in.c_str(), in.size() );
wstring ws( buf, num_chars );

这里我有字符串ws = 'WeiÃ'如果我展开 ws 看到字符串中有 5 个字符,第 5 个字符是159:L''.

wostringstream oss;
oss << L"insert into myutftable values("
                                       << id
                                       << L"',  '"
                                       << ws
                                       << L") ";

然后我正在使用SQLExecDirect更新数据库。这是我看到崩溃的地方。

我试图了解它为什么会崩溃。我尝试了一些不成功的事情。我用过character set = utf8但没有运气。谁能告诉我崩溃的原因以及如何解决?

顺便说一句,我使用的是 Firebird 数据库 2.0 版。

UPDATE1:

1)如果我不将 UTF8 字符串转换为 wstring 并使用SQLExecDirectAcall 它工作正常。但此时我不知道副作用,因为该数据库已从许多其他地方访问。

2) 我尝试使用 isql.exe 从命令行推送相同的字符串,没有问题!

我想知道为什么在我的调试器监视列表中没有显示最后一个字符(Ÿ转换为 wchar 后的这个字符显示为159:L''。我查看了字符集 159 指的Ÿ是只是char?

有没有办法调试SQLExecDirect?我正在使用 OdbcJdbc 驱动程序。

Update 2: 好像Ÿ我的字符串中的字符有问题。只要我将它作为字符串发送,如果我完全使用 wstring,它就会失败。

我刚刚在内存中观察到当我将它发送为 (= Ÿ) 时它是如何9f表示的SQLExecDirectA9f 00SQLExecDirect

我的应用程序是使用 Unicode 字符集构建的。Firebird 数据库字符集设置为无。

有任何想法吗??

4

1 回答 1

4

mbstowcs假定它的第二个参数是系统默认代码页中的字符串,也称为CP_ACP,它绝不是 UTF-8(也称为CP_UTF8)。

的倒数WideCharToMultiByteMultiByteToWideChar。虽然不清楚为什么要将字符串从 Unicode 转换为 UTF-8,但只是将其转换回来。

于 2013-08-26T22:39:49.017 回答