Пытаюсь опробовать возможности 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, который таки работает с русскими строками. Но там модуль не объектный и с очень ограниченными возможностями, так что использовать его в реальной работе плохо.
Может быть кто разбирался с такой проблемой, исследовал ее? В общем, я пока не знаю, что делать и жду любых советов.