Я конвертирую один из наших проектов Delphi 7 в Delphi X3, потому что мы хотим поддерживать Unicode. Мы используем MS SQL Server 2008/R2 в качестве нашего сервера базы данных. После изменения некоторых полей базы данных от VARCHAR до NVARCHAR (и полей в сопровождающих ClientDatasets на ftWideString) произошли случайные сбои. Во время отладки я заметил неожиданное поведение TClientDataset/DbExpress:
Для базы данных NVARCHAR (10) я вручную создаю TWideStringField в наборе clientdataset и устанавливаю свойство 'Size' равным 10. Свойство DataSize этого поля говорит мне, что требуется 22 байта, что ожидается, так как кодирование TWideStringField UTF-16, поэтому ему нужно два байта на символ и некоторое пространство для хранения длины. Теперь, когда я вызываю "CreateDataset" в ClientDataset и записываю набор данных в XML (используя .SaveToFile), в XML файле поле определяется как
<FIELD WIDTH="20" fieldtype="string.uni" attrname="TEST"/>
который выглядит нормально для меня.
Теперь вместо вызова .CreateDataset я вызываю. Откройте в TClientDataset, чтобы он получал свои данные через связанные компоненты → TDatasetProvider- > TSQLDataset (.CommandText = простой выбор * из таблицы) → TSQLConnection. Когда я проверяю свойства поля в своем списке просмотра, размер по-прежнему равен 10, Datasize все равно 22. После сохранения в файл XML это поле определяется как
<FIELD WIDTH="40" fieldtype="string.uni" attrname="TEST"/>
.. ширина удвоилась?
Наконец, если я вызову. Открыть в TClientDataset, не создавая заранее никаких полей, размер поля будет 20 (неверно!) и Datasize 42. После сохранения в XML, поле по-прежнему определяется как
<FIELD WIDTH="40" fieldtype="string.uni" attrname="TEST"/>
Кто-нибудь знает, что здесь не так?