Select语句和隐式转换只给我一个字符串的第一个字符

时间:2012-01-11 20:10:33

标签: c++ database string oledb

我正在使用OLEDB连接到VC ++中的本地Oracle 11gR2数据库。我正在使用CCommand :: Open来从我的数据库中选择行,该行应该包含字符串。

当我使用GetValue来获取我的数据时,我只获得了第一个字符。 以下是我获取该数据的尝试。请注意,“GetValue”和“GetColumnName”中会出现相同的行为。

char* test = (CHAR*)cmd.GetColumnName(2);
cout << (CHAR*)cmd.GetColumnName(2) << endl;
printf_s( "%s", (CHAR*)cmd.GetColumnName(2));
printf_s( "%S", (CHAR*)cmd.GetColumnName(2)); //This one works, 
       //but I really need to store my data, not just print it.

我认为这是从SQL到C ++数据类型的转换问题,但我不能指责它。帮助

1 个答案:

答案 0 :(得分:3)

LPOLESTRwchar_t*字符串(感谢LRiO确认),基本上是unsigned short*。你得到第一个字符的原因是因为每个字符占用两个字节,英文字母恰好是一个NULL字节,后跟该字母的ASCII码,当以小端格式存储时,使其成为带有一个字符的C字符串(因为字节向后存储)。

您需要使用wcout进行打印:

wcout << cmd.GetColumnName(2);

您可以像这样存储它(及其长度通过wcslen):

LPOLESTR ostr = cmd.GetColumnName(2);
size_t ostrlen = wcslen(ostr);