Оператор выбора и неявное преобразование дают мне только первый символ строки - PullRequest
0 голосов
/ 12 января 2012

Я использую OLEDB для подключения к моей локальной базе данных Oracle 11gR2 в VC ++. Я использую 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 Ответ

3 голосов
/ 12 января 2012

LPOLESTR - это строка wchar_t* (спасибо LRiO за подтверждение), которая в основном unsigned short*. Причина, по которой вы получаете только первый символ, состоит в том, что каждый символ занимает два байта, а английские буквы оказываются NULL-байтом, за которым следует код ASCII для этой буквы, который при хранении в формате с прямым порядком байтов делает его C-строка с одним символом (потому что байты хранятся в обратном направлении).

Вам нужно использовать wcout, чтобы напечатать его:

wcout << cmd.GetColumnName(2);

Вы можете сохранить его так (вместе с его длиной через wcslen):

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