Пытаюсь опробовать возможности Free Pascal для работы с oracle. И сразу же наткнулся на грабли. Используя модули sqldb и oracleconnection неполучается сделать select полей из таблицы, содержащей строки в русской кодировке. Причем, проблема имеет место быть только в юникодной локали. Если локаль перевести в другую кодировку, то все работает. Краткий анализ показал, что ошибки получаются при попытке открыть запрос и профетчить строки. ORA-01406
Я сомневаюсь, чтобы я что-то неверно в программе написал (т.к. с латиницей все работает), но навсякий случай приведу код:
- Код: Выделить всё
- Program testora;
 Uses sqldb, oracleconnection;
 Var
 OraConn : TOracleConnection;
 OraTrans : TSQLTransaction;
 OraQuery : TSQLQuery;
 begin
 OraConn := TOracleConnection.Create (nil);
 with OraConn do begin
 DatabaseName := 'mybase';
 UserName := 'user';
 Password := 'pass';
 HostName := '192.168.1.1';
 Open;
 end;
 OraTrans := TSQLTransaction.Create (nil);
 OraTrans.DataBase := OraConn;
 OraQuery := TSQLQuery.Create (nil);
 OraQuery.DataBase := OraConn;
 OraQuery.Transaction := OraTrans;
 OraQuery.Sql.Clear;
 OraQuery.Sql.Add('insert into aaa (a1, a2, a3) values (2, :par1, null)');
 OraQuery.Params.ParamByName ('pas1').AsString := 'Всем привет';
 OraQuery.ExecSql;
 OraQuery.Sql.Clear;
 OraQuery.Sql.Add ('select a1, a2, a3 from aaa');
 OraQuery.Open; // <-- тут получаю ошибку
 while not OraQuery.Eof do begin
 write (OraQuery.FieldByName ('a1').AsInteger);
 write (OraQuery.FieldByName ('a2').AsString);
 write (OraQuery.FieldByName ('a3').Asdatetime);
 writeln;
 OraQuery.Next;
 end;
 OraQuery.Close;
 OraQuery.Free;
 OraTrans.Free;
 OraConn.Free;
 end.
Однако, в examples я нашел еще неплохой примерчик source/packages/base/oracle/example, который таки работает с русскими строками. Но там модуль не объектный и с очень ограниченными возможностями, так что использовать его в реальной работе плохо.
Может быть кто разбирался с такой проблемой, исследовал ее? В общем, я пока не знаю, что делать и жду любых советов.



