C #: возможно ли хранить десятичный массив в базе данных SQL? - PullRequest
2 голосов
/ 07 августа 2009

Я работаю над приложением для лабораторного проекта и делаю его на C #. Предполагается импортировать результаты из текстового файла, который экспортируется из приложения, которое мы используем для запуска тестов, и до сих пор я столкнулся с проблемой.

Я получил программу для сохранения около 250 десятичных значений в виде одномерного массива, но затем я пытаюсь сделать так, чтобы сам массив мог быть сохранен в базе данных SQL, чтобы впоследствии я мог получить массив и используйте десятичные значения для построения графика точек.

Мне нужно, чтобы весь массив был импортирован в базу данных как одно единственное значение, потому что у лабораторного проекта есть несколько образцов, каждый из которых имеет собственный набор из 250 или более десятичных знаков (которые также будут храниться как массивы)

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ : Спасибо за быстрые ответы, ребята, но проблема в том, что это не просто результат образца с 1 пробным прогоном. Каждый образец сам выполняет один и тот же тест с различными уровнями децибел более 15 раз. Каждый тест имеет свои наборы из 250 результатов, и у нас есть много образцов.

Кроме того, экземплярам уже присвоен уникальный идентификатор, и он будет сохранен как строка, а не как Int. Я планирую создать отдельную таблицу в БД для каждого образца, чтобы каждая строка содержала информацию об уровне теста в децибелах и сохраняла сериализованный массив ...

Я думаю, что это сработает, потому что нам НЕ нужно будет получать доступ к отдельным точкам данных прямо из базы данных; Я просто использую базу данных для хранения данных из памяти, так как их так много. Я собираюсь запросить в базе данных массив и другую информацию, а затем использовать zedgraph для построения точек в массиве и сравнения нескольких образцов одновременно.

Ответы [ 7 ]

18 голосов
/ 07 августа 2009

Короткого ответа абсолютно нет. Это две совершенно разные структуры данных. Есть обходные пути, такие как вставка в двоичный объект или запятую, разделяющую текстовый столбец. Но я действительно ненавижу это. Он не позволяет вам выполнять математику на уровне SQL Server.

IMO, лучший вариант включает в себя наличие более одного столбца в вашей таблице. Добавьте идентификатор, чтобы вы знали, какому массиву принадлежит точка данных.

Например:

AutoId    Specimen    Measurement
   1         A            42
   2         A            45.001
   3         B            47.92

Затем, чтобы получить результаты:

select 
    measurement 
from 
    mytable 
where 
    specimen = 'A'
order by
    autoid asc

Редактировать: Вы планируете создать отдельную таблицу из 250 строк для каждого образца? Это абсолютно излишне. Просто используйте одну таблицу, укажите идентификатор образца в виде столбца (как показано) и индексируйте этот столбец. SQL Server может хорошо справляться с миллионами и миллионами строк. Базы данных действительно хороши в этом. Почему бы не использовать их сильные стороны вместо того, чтобы пытаться воссоздать структуры данных C #?

3 голосов
/ 07 августа 2009

Мне нужно импортировать весь массив в базу данных как одно значение хотя, потому что лабораторный проект имеет несколько экземпляров, каждый со своим набор из 250 или около того десятичных знаков (которые будет также храниться в виде массивов)

Итак, вы пытаетесь забить гвоздь, если вы используете старый ботинок или стеклянную бутылку ?

Ответ здесь не в том, чтобы «сериализовать массив в XML и сохранить его в записи». Вы действительно хотите стремиться к правильному проектированию базы данных, и в вашем случае самый простой дизайн:

Specimens
---------
specimenID (pk int not null)

SpecimenData
------------
dataID (pk int not null
specimenID (fk int not null, points to Specimens table)
awesomeValue (decimal not null)

Запрос данных очень прост:

SELECT * FROM SpecimenData, где specimenID = @ specimenID

1 голос
/ 07 августа 2009

Предположительно, вы можете сериализовать десятичный массив в C # в байтовый массив и сохранить его в двоичном поле таблицы. Ваша таблица будет иметь два поля: SpecimenID, DecimalArrayBytes

В качестве альтернативы вы можете иметь таблицу типа «многие ко многим» и не хранить массив в одной части, имея поля: SpecimenID, DecimalValue и использовать SQL как

SELECT DecimalValue FROM Table WHERE SpecimenID = X
1 голос
/ 07 августа 2009

Пока вы не обращаетесь к отдельным значениям в ваших запросах, вы можете сериализовать массив и сохранить его как большой двоичный объект в базе данных.

0 голосов
/ 07 августа 2009

Хотя любой данный пример может быть непрактичным, с помощью программирования вы можете создать любую форму колышка в любую форму отверстия.

Вы можете сериализовать ваши данные для хранения в varbinary, XML-файлы для хранения в тип SQL Server XML и т. Д.

Выберите маршрут для анализа и тщательно обдумайте. Вы также можете создавать собственные библиотеки CLR для SQL, так что виртуальное небо - это предел.

0 голосов
/ 07 августа 2009

Вы хотите две таблицы. Один для хранения индекса, другой для хранения десятичных значений. Примерно так:

create table arrayKey (
   arrayId int identity(1,1) not null
)

create table arrayValue (
   arrayID int not null,
   sequence int identity(1,1) not null,
   storedDecimal decimal(12,2) not null
)

Вставьте в arrayKey, чтобы получить идентификатор для использования. Все десятичные значения будут сохранены в arrayValue с использованием идентификатора и десятичного значения для хранения. Вставьте их по одному.

Когда вы получаете их, вы можете сгруппировать их по arrayID, чтобы они все вышли вместе. Если вам нужно получить их в том же порядке, в котором вы их сохранили, сортируйте по порядку.

0 голосов
/ 07 августа 2009

Вы можете сериализовать массив и сохранить его как один фрагмент xml / binary / json. Вот пример сериализации как XML.

public static string Serialize<T>(T obj)
{
    StringBuilder sb = new StringBuilder();
    DataContractSerializer ser = new DataContractSerializer(typeof(T));
    ser.WriteObject(XmlWriter.Create(sb), obj);
    return sb.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...