Не получается вставить в таблицу записи со строками на русском языке
В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr.
Это простой вопрос в том случае, если база уже создана на диске.
Если мы создаем базу динамически из программы, то как потом поставить
русский язык без Database Desktop'а?
Оказывается это не так просто. Я перерыл весь инет и так и не нашел.
В итоге пришлось потрудится и получилась следующая функция:
{ Устанавливает русский LANGDRIVER для таблицы BDE (Paradox или dBASE)}{ Таблица должна уже существовать на диске
Если вы создаете таблицу динамически,
не забудьте вызвать Table.CreateTable }procedure SetTableRussianLanguage(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
OptDesc: FLDDesc;
OptData: array [0..250] of Char;
S: string;
const// Define propertly table type & codepage from list below
LDName = 'ancyrr'; // Paradox ANSI Cyrillic // LDName = 'cyrr'; // Paradox Cyrr 866// LDName = 'DB866ru0'; // dBASE RUS cp866 begin// Get handle (if table still not opened)
Table.Open;
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
FillChar(OptDesc, SizeOf(OptDesc), #0);
// Get the database handle from the table's cursor handle...
Check( DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE,
hDBIObj(hDb)));
{ If table name contain cyrillic or other native character,
convert name to OEM }
SetLength(S, Length(Table.TableName));
CharToOEM(PChar(Table.TableName), @S[1]);
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, S{Table.TableName});
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
StrCopy(OptDesc.szName, 'LANGDRIVER');
OptDesc.iLen:=Length(LDName)+1;
TableDesc.iOptParams:=1;
TableDesc.pfldOptParams:=@OptDesc;
TableDesc.pOptData:=@OptData;
StrPCopy(OptData, LDName);
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end;
Проблема настройки русскоязычного драйвера для таблицы в базе данных - это действительно сложная задача!
Сначала я хотел бы поздравить вас с решением этой проблемы. Вам удалось создать процедуру SetTableRussianLanguage, которая, по-видимому, работает корректно.
Давайте разбьем код на шаги:
Он открывает таблицу и получает ее.handle.
Он получает свойства таблицы с помощью DbiGetCursorProps.
Он очищает структуру для описания таблицы (TableDesc) и опции (OptDesc).
Он получает handle базы данных из handle курсора таблицы с помощью DbiGetObjFromObj.
Если имя таблицы содержит кириллицу или другие национальные символы, он конвертирует имя в OEM с помощью CharToOEM.
Он устанавливает имя и тип таблицы в описании таблицы.
Он устанавливает параметр Pack в описании таблицы на TRUE.
Он создает массив данных опций (OptData) с именем русскоязычного драйвера (LDName).
Наконец, он закрывает таблицу и вызывает DbiDoRestructure, чтобы применить изменения.
Однако у меня есть несколько предложений для улучшения:
Вместо того, чтобы жестко кодировать имя русскоязычного драйвера (LDName) как константу, вы могли бы сделать его параметром или переменной, которая может быть легко изменена, если это нужно.
Вы можете хотел бы добавить обработку ошибок для случаев, когда DbiGetCursorProps или DbiDoRestructure неудачно.
Было бы полезно предоставить больше контекста о том, как эта процедура планируется использоваться, например, является ли она часть более крупной программы или standalone-утилиты.
В целом, ваш код выглядит так, что он должен работать корректно, и я рад, что вы нашли решение этой проблемы!
Не получается вставить в таблицу записи со строками на русском языке, но можно использовать функцию SetTableRussianLanguage для установки русского LANGDRIVER для таблицы BDE (Paradox или dBASE).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.