Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO, BDE, FOX, dBASE: КОДИРОВКА ДОС/ВИН [D6, dBase, FoxPro]


Alex_xxx ©   (2004-05-11 10:43:00) 

Подскажите, кто знает.
Дано: таблицы FOX с описаниями DOS-кодировка(исходные данные).
таблица dBASE с результатом. Тоже должна быть в ДОСе.
Из таблиц FOXa читаю через ADO.
При попытке записать в dBASE через ADO получается фигня:
....
qADOQSave.SQL.Add('insert into plucash (articul,name) values (:art,:name))';
qADOQSave.Parameters.Items[0].Value:=qADOQGet.FieldByName('ARTICUL').AsString;
qADOQSave.Parameters.Items[1].Value:=WindowsToDos(qADOQGet.FieldByName('name2').AsString);
qADOQSave.ExecSQL;
....
При замене qADOQSave на qBDESave - все отлично.

Функция WindowsToDos выглядит так:
function WindowsToDos(s:string):string;
var s1,s2:string;
begin
  s1:=s;  SetLength(s2,Length(s1));
  CharToOem(PChar(s1),PChar(s2));
  WindowsToDos:=s2;
end;

НО: хочется все сделать в ADO. Даже требыется ADO :-(

Есть ли решение этой проблемы?


Alex_xxx   (2004-05-11 12:14:00) [1]

Спасибо. После обеда попробую.


sniknik   (2004-05-11 12:00:00) [2]

со второй ничего не сделаеш как есть так и читает (настроек перекодировки нет (?) не находил/с другой стороны и в документацию сильно не углублялся)

а первую советую сменить, на
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=dBase IV;Persist Security Info=False
т.к. есть неопределенность в использовании старого ODBC драйвера, он подменяется jet-ом, и в разных вариантах будут разные настройки, и + не нужен DSN имя которого тоже может быть разным (английское/русское)
хотя при смене тоже есть варианты установлен/неустановлен BDE но их всетаки на один меньше будет ;о)
изменяется в реестре (для твоей строки это тоже скорее всего действует (значит уже подменен))
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase

DataCodePage
Этот параметр используется только в том случае, если на данном компьютере не установлено приложение BDE.
Определяет способ сохранения текстовых страниц. Возможные значения:

OEM — Преобразования из OEM в ANSI и из ANSI в OEM выполняются.
ANSI — Преобразования из OEM в ANSI и из ANSI в OEM не выполняются.
По умолчанию задается значение «OEM». Значения имеют тип String в Windows 95 и Windows NT 4.0 или тип REG_SZ в Windows NT 3.51.


да вторую тоже можно поменять (просто избавиться от DSN заменив его на имя драйвера)
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DRIVER={Microsoft Visual FoxPro Driver};UID=;SourceDB=d:\;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

> А за количество строк мне не платят, сделал так потому, что работает, а красоты наводить некогда :-)
так оно и быстрее будет, не только ради красоты.


Alex_xxx   (2004-05-11 11:39:00) [3]

Строки следующие:
dbRezult.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;'+'Extended Properties="DSN=файлы dBASE;DBQ='+PPlu+';DefaultDir='+PPlu+';DriverId=533;MaxBufferSize=2048;PageTimeout=5;"';

dbShop.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;'+'Extended Properties="DSN=Visual FoxPro Tables;UID=;'+'SourceDB='+PShop+';SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;'+'Deleted=Ye s;"';

А за количество строк мне не платят, сделал так потому, что работает, а красоты наводить некогда :-)


sniknik   (2004-05-11 11:16:00) [4]

т.е. 2 коннекта к фоксу и дбасе? строки конекта какие?

или коннект один? тогда не получится (у фокса(VFP) 1251 страница в дос у dBase 866) это вариант когда нужны преобразования.
у старого фокса та же страница, и преобразования не нужны совсем (можно просто copy файлу) но ты же их делаеш (?).

функцию можно поменять (меньше места займет, или тебе за количество строк платят? ;о)))

function WindowsToDos(const s: string): string;
begin
 SetLength(result, Length(s));
 CharToOem(PChar(s),PChar(result));
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо