2009-08-07 3 views
2

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

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

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

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

EDIT: Спасибо за быстрые ответы, ребята, но проблема в том, что его результаты были получены не только от образца с 1 испытанием. Каждый экземпляр сам по себе имеет те же тесты, что и у них с разным уровнем децибел в 15 раз. Каждый тест имеет свои собственные 250 результатов, и у нас много образцов.

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

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

+1

Что касается редактирования, это звучит так, будто вы уже определились, прежде чем задавали вопрос. Учитывая, что самые высокие голосованные ответы говорят вам «не делайте этого», почему вы даже попросили совета, если вы все равно не будете слушать? –

+1

Легко. Был определенный вопрос: как вы делаете X? Ответы «самый высокий голос» - это «Не делай X». Это не об игнорировании рекомендаций - ответы не отвечают на вопрос. –

+2

Это хороший пример того, почему ученые и инженеры не должны допускаться рядом с базами данных ;-) –

ответ

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 

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

+2

+1 хороший ответ. Я взял на себя смелость добавить в запрос предложение «по порядку», потому что я предполагаю, что порядок точек данных важен в этом случае, и хотя очень вероятно, что аутоид будет установлен как кластерный ПК, а также очень вероятно, что база данных будет использовать это для заказа результатов, заказ не гарантируется, если вы не укажете его. –

+0

@Greg: Обязательно! – Eric

+0

Ну, мне не нужно делать математику на уровне сервера или что-то еще; Мне просто нужно иметь возможность запросить базу данных, чтобы материал не нужно хранить в памяти на компьютере, так как на них было так много образцов и тестов. – ankushg

1

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

+0

+1, первый ответ на сериализацию на 5 секунд –

+3

eh: им может не понадобиться это сейчас, но дать ему достаточно времени, и они захотят запросить отдельные измерения. Так оно и всегда. Определенно лучше поставить их в свой стол. –

+0

Я полностью согласен с Джоэлем. Если это реляционная база данных, используйте ее как реляционную базу данных. –

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

Да, я просто пытался ответить на его конкретный вопрос, не пытаясь перестроить его решение. – jasonmw

1

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

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

SELECT DecimalValue FROM Table WHERE SpecimenID = X 
+0

Это решение, которое я собираюсь предложить. –

3

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

Итак, вы пытаетесь забить гвоздь, если вы используете an old shoe or a glass bottle?

Ответ здесь не «сериализует массив в 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

+0

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

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

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

Вы можете сериализовать данные для хранения в VARBINARY, XML-Изе его для хранения в тип XML SQL Server и т.д.

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

Смежные вопросы