| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Запись Variant в TMemoryStream |
| Автор: Steel 14.12.2011, 22:33 |
| Здравствуйте. Пытаюсь заделать инструмент для перевода результата запроса (TADOQuery) к любой таблице БД Access в бинарный файл. Идея была в следующем: 1. Пройти по массиву полей Fields первой записи и сохранить в поток размеры полей, их имена и типы. 2. Идти по записям и сбрасывать в поток значения полей в соответствии с их размером. Столкнулся с проблемой на втором шаге. У меня есть значения полей типа Variant (Fields[n].Value) и есть размер данных значений (Fields[n].DataSize), но я не могу эти значения записать. Если пытаюсь писать Fields[n].DataSize байт из Fields[n].Value - в поток пишется некая чушь, а не значение поля. Вопрос: Как мне добыть нужное мне кол-во байт из типа Variant? |
| Автор: Snowy 14.12.2011, 22:38 |
| Сначала присвой значение из вариант в переменную другого типа. Например в integer/string/array. И записывай уже его. Обратно аналогично. Поведение варианта не фиксировано и зависит от ситуации. Для записи в бинарный вид это не годится. |
| Автор: Steel 14.12.2011, 23:30 |
| Тогда получается что я должен знать структуру таблицы. А я хотел сделать вариант именно для любой структуры. Получается нету способа представить значение переменной типа Variant как к примеру массив байт? |
| Автор: Snowy 15.12.2011, 02:09 |
| Ваиант меняет своё поведение в зависимости от ситуации. А бинарная запись таких вольностей физически не может иметь. В бинарной записи должно быть строгое определение, что писать. Можно, конечно, конкретизировать поведение на уровне сериализации, но это будет ещё сложнее. Могу предложить приводить все данные к string и писать их, как string. |
| Автор: Steel 15.12.2011, 20:14 | ||||
В общем при следующей реализации удалось свалить в бинарный файл таблицу с полями типа {DateTime, Single, Byte}
|
| Автор: Steel 15.12.2011, 20:32 | ||
| Также провел эксперимент над TVarData. 1. Присваивал значение переменной какого-либо типа. 2. Присваивал ее переменной типа Variant 3. Обнулял первую переменную 4. Копировал из TVarData(пременная типа Variant).VBytes[6] в буфер кол-во байт, соотвествующие типу иходной переменной. 5. Копировал столько же байт из буфера в исходную переменную 6. Проверял результат Издевался над переменными типов {Integer, Word, LongWord, Byte, Double, Single} В итоге в исходную переменную вернулось исходное значение во всех случаях, кроме того когда иходная переменная была типа Single. Это случилось из-за того что сам Variant после присвоения ему такой переменной почему то считает себя Double. Как это победить я не нашел.
PS использовал Delphi 2007 |