Хранение массива структур в БД

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Хранение массива структур в БД

Сообщение unICS » 18.07.2008 (Пт) 14:00

Доброго времени суток, господа! Такой вопрос: имеется структура/запись (или как это в VB называется) вида:
Код: Выделить всё
Private Type COORDS
    x As Double
    y As Double
    z As Double
End Type

Private Type NORMAL
    i As Double
    j As Double
    k As Double
End Type

Private Type VERTEX
    vert As COORDS
    norm As NORMAL
End Type

Dim vertexArray() As VERTEX

Хочу сохранить весь массив vertexArray в БД. Т.е. целиком и полностью от первого поля первого элемента до последнего поля последнего элемента. Читать эти данные будет уже другая программа (хотя и эта тоже будет), написанная на Си. Собственно вопрос: как подобную задачу можно реализовать? Я, например, не знаю как выглядит структура/запись "изнутри", не будет ли у меня потом проблем с чтением этих данных из Си-программы, как хранятся элементы массива в VB (строго по порядку, как в Си или иначе). Вобщем буду рад любому совету, как бы мне это всё "провернуть"))

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.07.2008 (Пт) 14:04

Код: Выделить всё
Dim Save() as Byte
Dim d as VERTEX

ReDim Save(Len(d) * UBound(vertexArray))
CopyMemory Save(0), vertexArray(0), UBound(Save)
В базе создается табица с полем типа OLE (Access)/Image (MSSQL), в это поле скидывается массив Save. Все.
Желательно типы объявить в tlb и пользоваться ею и в вб и в си, чтобы гарантированно не было проблем.
Последний раз редактировалось Antonariy 18.07.2008 (Пт) 14:08, всего редактировалось 2 раз(а).
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 14:04

Проблем быть не должно, если только вдруг не появятся какие-нибудь проблемы с выравниванием. Но они легко лечатся добавлением Reserved-полей.

Только вот смысл такого хранения остаётся непоятным. Почему бы тогда не использовать просто файл?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.07.2008 (Пт) 14:10

Кстати, зачем объявлять NORMAL в дополнение к COORDS? Можно же сделать так:
Код: Выделить всё
Private Type VERTEX
    vert As COORDS
    norm As COORDS
End Type
Лучший способ понять что-то самому — объяснить это другому.

unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Сообщение unICS » 18.07.2008 (Пт) 15:05

Antonariy писал(а):
Код: Выделить всё
Dim Save() as Byte
Dim d as VERTEX

ReDim Save(Len(d) * UBound(vertexArray))
CopyMemory Save(0), vertexArray(0), UBound(Save)

Не совсем ясно, а для чего массив Save нужен? Раз уж на то пошло, то почему нельзя сразу vertexArray и записывать.
Antonariy писал(а):В базе создается табица с полем типа OLE (Access)/Image (MSSQL)

Или с полем типа BLOB в SQLite :)
Antonariy писал(а):Желательно типы объявить в tlb и пользоваться ею и в вб и в си, чтобы гарантированно не было проблем.

Это, простите, как?
Хакер писал(а):Проблем быть не должно, если только вдруг не появятся какие-нибудь проблемы с выравниванием. Но они легко лечатся добавлением Reserved-полей.

Что это за поля такие? Как их добавить? Каким образом они спасают от проблем с выравниванием?
Хакер писал(а):Только вот смысл такого хранения остаётся непоятным. Почему бы тогда не использовать просто файл?

Именного его я и использую, камрад, файл базы данных :)
Antonariy писал(а):Кстати, зачем объявлять NORMAL в дополнение к COORDS? Можно же сделать так:
Код: Выделить всё
Private Type VERTEX
    vert As COORDS
    norm As COORDS
End Type


Так точно. Можно сделать так. Ещё в принципе можно сделать так:
Код: Выделить всё
Private Type VERTEX
    x As Double
    y As Double
    z As Double 
    i As Double
    j As Double
    k As Double
End Type

Насколько я понимаю никакой принципиальной разницы между всеми тремя вариантами нет.
Я ещё один момент прояснить хотел. Собственно это (хранение массива структур) нужно в первую очередь для того, что бы как можно быстрее прочитать потом записанные данные. Т.е. посылаю запрос к БД, она мне возвращает содержимое i-ой ячейки и это содержимое уже готово к "употреблению". Т.е. хочу избавиться от лишнего парсинга, от заполнения, уже вобщем-то, заполненной структуры и т.п. Т.е. взять блок данных, а он уже полностью готов, остается только в массив его снова загнать, что бы совсем, как перед записью выглядел.
Я вообще на правильном пути???

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 15:10

Это, простите, как?

Создаёшь TLB с описанием типа VERTEX. Вот так.

Что это за поля такие? Как их добавить? Каким образом они спасают от проблем с выравниванием?

Dim Reserved1 As Long
Dim Reserver2 As Long
...
Dim ReservedN As Long

Спасают тем, что размер структуры становится кратным границе выравнивания.

Именного его я и использую, камрад, файл базы данных

Просто файл. Без посредников, в лице СУБД.
Ы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.07.2008 (Пт) 15:24

Не совсем ясно, а для чего массив Save нужен? Раз уж на то пошло, то почему нельзя сразу vertexArray и записывать.
Потому что OLE/Image/BLOB не знают что такое массив VERTEXARRAY, зато прекрасно знакомы с массом байт. rs(x).Value = Save
Я вообще на правильном пути???
Ты даже не заметил, как я тебя за ручку провел до конца этого пути? Попробуй открыть глаза и пройти его обратно. :)
Лучший способ понять что-то самому — объяснить это другому.

unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Сообщение unICS » 18.07.2008 (Пт) 16:37

Хакер писал(а):Создаёшь TLB с описанием типа VERTEX. Вот так.

Хорошо. Спрошу по другому: а что мне это даст? Я с этим TLB из Си смогу работать?
Хакер писал(а):Просто файл. Без посредников, в лице СУБД.

Нее, без СУБД никак. "Просто файл" не годится.
Antonariy писал(а):Ты даже не заметил, как я тебя за ручку провел до конца этого пути? Попробуй открыть глаза и пройти его обратно.

Ты прав. Я даже и не заметил. Камрад, можно без этих хитросплетений, ты что сказать-то хотел? Кстати по поводу: "за ручку провел до конца этого пути". Это по части записи массива в БД может и до конца, а вот насколько эти данные будут пригодны, когда я их в Си прочитаю? Я так полагаю (чисто моя догадка), что две структуры "как бы" одинаковые в Си и в VB будут выглядет всё же по разному на уровне байтов. Т.е., скажем, вот это:
Код: Выделить всё
struct {
   double x;
   double y;
   double z;
} VERTEX;

Совсем не тоже самое, что вот это:
Код: Выделить всё
Private Type VERTEX
   x As Double
   y As Double
   z As Double
End Type

Но, это, повторюсь, я так думаю (не знаю).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 16:40

То же самое это, на уровне, как ты говоришь, байтов.

Другое дело, что массивы на уровне байтов могут быть разными. Но если добавить туда ещё один резервный Double, то точно будут одинаковыми.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Сообщение unICS » 19.07.2008 (Сб) 9:27

Как мне подсказали, есть такой прием, называется сериализация. Вроде как мой случай. Хотя я, признаться честно, понять не могу, нужно мне тут это или нет. Поиск по форуму выдал всего несколько топиков, где сериализация как-то фигурировала, но я всё равно не понимаю. Пробовал гуглить, это вообще темный лес... Тем не менее среди всего прочего, видел я и такое определение этого процесса:
Wikipedia писал(а):Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов.

Так что же? Мой это случай или нет? Если да, то можно ли нечто подобное в VB реализовать?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.07.2008 (Сб) 10:25

Пример кода, который я привел, можно назвать сериализацией.

В который раз вижу, что педивикии доверять нельзя. Во-первых не "какой-либо структуры", а объектной, во вторых не просто в "биты", а в вид, пригодный для записи в файл.
Лучший способ понять что-то самому — объяснить это другому.

unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Сообщение unICS » 19.07.2008 (Сб) 11:28

Antonariy писал(а):Пример кода, который я привел, можно назвать сериализацией.

В который раз вижу, что педивикии доверять нельзя. Во-первых не "какой-либо структуры", а объектной, во вторых не просто в "биты", а в вид, пригодный для записи в файл.

Что значит "объектной"? Type в VB это объектная структура? А массив тайпов - объектна структура? Вот по поводу твоего примера кода, всё вроде ясно. Но, как я уже спрашивал, а не получится ли так, что записать-то я запишу, а вот в СИшную структуру потом не прочитаю. Т.е., воспользоваться твоим примером можно в том лишь случае, если:
1) struct в Си абсолютно идентичен Type в VB
2) Массивы и в Си, и в VB одинаково хранятся в памяти

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.07.2008 (Вс) 7:06

Что значит "объектной"? Type в VB это объектная структура? А массив тайпов - объектна структура?
Странные вопросы.
Скажу так: переменные составных типов в общем случае можно записать на диск, объектные переменные — нет. Однако потребность сохранять состояние объекта иногда возникает, причем для каждого объекта процедура сохранения индивидуальна. Вот группа перцев, обожающих придумывать названия, и нарекла комплекс мероприятий по сохранению состояния объекта "сериализацией".

1) Уже бы давно взял да проверил.
2) Как они хранятся в памяти абсолютно фиолетово. Я только могу гарантировать, что CopyMemory даст одинаковый результат и в VB и в Си при выполнении п. 1. Ну а чтобы п. 1 гарантированно выполнялся, нужно объявить структуру в tlb. Или дополнить ее reserved-полем, только лучше байтовым, а не лонгом, чтобы лишнее место не занимало.
Лучший способ понять что-то самому — объяснить это другому.

unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Сообщение unICS » 20.07.2008 (Вс) 16:19

Antonariy, спасибо, камрад. Ясно по прежнему не всё, но надоедать с вопросами тоже не хочется. Буду пробовать.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 21.07.2008 (Пн) 8:13

unICS
а почему не устраивает таблица с шестью полями типа Real?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.07.2008 (Пн) 9:07

Денис
Тем, что нужно делать цикл по заполнению массива.
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 21.07.2008 (Пн) 10:24

Antonariy
Я имею ввиду, сделать таблицу:

Код: Выделить всё
TABLE "Vertex"
  (
  x         FLOAT,
  y         FLOAT,
  z         FLOAT,
  i         FLOAT,
  j         FLOAT,
  k         FLOAT
  );


И в цикле заполнять ее значениями массива. И так же в цикле грузить из нее значения в массив... Зачем весь этот огород из сохранения структуры целиком?
_______________
Ой, извиняюсь за невнимательность

Т.е. посылаю запрос к БД, она мне возвращает содержимое i-ой ячейки и это содержимое уже готово к "употреблению". Т.е. хочу избавиться от лишнего парсинга, от заполнения, уже вобщем-то, заполненной структуры и т.п.


Вопрос снят.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 60

    TopList