C #: возможно ли хранить десятичный массив в базе данных SQL?

2

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

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

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

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

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

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

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

  • 1
    Что касается редактирования, похоже, что вы уже приняли решение, прежде чем задать вопрос. Принимая во внимание, что ответы, получившие наибольшее количество голосов, говорят вам «не делайте этого», почему вы даже попросили совета, если вы все равно не собираетесь слушать?
  • 1
    Легко. Возник конкретный вопрос: как ты делаешь Х? Ответы с наибольшим количеством голосов: «Не делай Х». Дело не в игнорировании совета - ответы не отвечают на вопрос.
Показать ещё 2 комментария
Теги:
arrays
visual-studio

7 ответов

18
Лучший ответ

Короткий ответ абсолютно нет. Это две совершенно разные структуры данных. Есть работа вокруг, например, поместить его в блокнот или запятую, разделяя текстовую колонку. Но я действительно их ненавижу. Это не позволяет выполнять математику на уровне 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 может обрабатывать миллионы и миллионы строк. Базы данных действительно хороши в этом. Почему бы не играть в свои сильные стороны, а не пытаться воссоздать структуры данных С#?

  • 2
    +1 хороший ответ. Я позволил себе добавить в запрос предложение "order by", потому что я предполагаю, что порядок точек данных важен в этом случае, и хотя весьма вероятно, что autoid будет установлен как кластеризованный PK, а также очень вероятно, что база данных будет использовать это для упорядочивания результатов, упорядочение не гарантируется, если вы не укажете это.
  • 0
    @Greg: Обязан!
Показать ещё 5 комментариев
3

Мне нужен весь массив, который нужно импортировать в базу данных как одно значение хотя из-за того, что в несколько экземпляров, каждый со своими набор из 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, где sampleID = @specimenID

  • 0
    Дело в том, что для экспериментов есть нечто большее, чем просто образец и ценность; Есть несколько тестов, проведенных на одном и том же образце со своими собственными результатами, и есть разные группы образцов (но это включено в Идентификатор образца) ... есть номера групп, номера записей, длительности сбора, уровни децибел. просто быть слишком сложным для меня, чтобы каждое значение хранилось отдельно, так как мне нужно отобразить его с помощью zedGraph и всего остального.
1

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

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

SELECT DecimalValue FROM Table WHERE SpecimenID = X
  • 0
    Это решение, которое я собирался предложить.
1

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

  • 0
    +1, первый ответ сериализации через 5 секунд
  • 3
    эх: им это может и не понадобиться сейчас, но дайте ему достаточно времени, и они захотят запросить данные по отдельным измерениям. Так всегда и бывает. Определенно лучше поместить их в свою таблицу.
Показать ещё 2 комментария
0

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

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

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

0

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

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
)

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

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

0

Вы можете сериализовать массив и сохранить его как единый фрагмент 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();
}
  • 1
    Сериализация - это то, что он ищет, но я не думаю, что это лучший ответ на эту проблему.
  • 1
    Да, я просто пытался ответить на его конкретный вопрос, не пытаясь перестроить его решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню