![]() |
|
|
![]()
|
|
| Steel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 14.5.2006 Где: Россия, Саратов Репутация: нет Всего: нет |
Здравствуйте.
Пытаюсь заделать инструмент для перевода результата запроса (TADOQuery) к любой таблице БД Access в бинарный файл. Идея была в следующем: 1. Пройти по массиву полей Fields первой записи и сохранить в поток размеры полей, их имена и типы. 2. Идти по записям и сбрасывать в поток значения полей в соответствии с их размером. Столкнулся с проблемой на втором шаге. У меня есть значения полей типа Variant (Fields[n].Value) и есть размер данных значений (Fields[n].DataSize), но я не могу эти значения записать. Если пытаюсь писать Fields[n].DataSize байт из Fields[n].Value - в поток пишется некая чушь, а не значение поля. Вопрос: Как мне добыть нужное мне кол-во байт из типа Variant? |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
Сначала присвой значение из вариант в переменную другого типа. Например в integer/string/array.
И записывай уже его. Обратно аналогично. Поведение варианта не фиксировано и зависит от ситуации. Для записи в бинарный вид это не годится. |
|||
|
||||
| Steel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 14.5.2006 Где: Россия, Саратов Репутация: нет Всего: нет |
Тогда получается что я должен знать структуру таблицы. А я хотел сделать вариант именно для любой структуры.
Получается нету способа представить значение переменной типа Variant как к примеру массив байт? |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
Ваиант меняет своё поведение в зависимости от ситуации.
А бинарная запись таких вольностей физически не может иметь. В бинарной записи должно быть строгое определение, что писать. Можно, конечно, конкретизировать поведение на уровне сериализации, но это будет ещё сложнее. Могу предложить приводить все данные к string и писать их, как string. |
|||
|
||||
| Steel |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 14.5.2006 Где: Россия, Саратов Репутация: нет Всего: нет |
В общем при следующей реализации удалось свалить в бинарный файл таблицу с полями типа {DateTime, Single, Byte}
|
||||
|
|||||
| Steel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 14.5.2006 Где: Россия, Саратов Репутация: нет Всего: нет |
Также провел эксперимент над TVarData.
1. Присваивал значение переменной какого-либо типа. 2. Присваивал ее переменной типа Variant 3. Обнулял первую переменную 4. Копировал из TVarData(пременная типа Variant).VBytes[6] в буфер кол-во байт, соотвествующие типу иходной переменной. 5. Копировал столько же байт из буфера в исходную переменную 6. Проверял результат Издевался над переменными типов {Integer, Word, LongWord, Byte, Double, Single} В итоге в исходную переменную вернулось исходное значение во всех случаях, кроме того когда иходная переменная была типа Single. Это случилось из-за того что сам Variant после присвоения ему такой переменной почему то считает себя Double. Как это победить я не нашел.
PS использовал Delphi 2007 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |