C#:是否可以在SQL数据库中存储十进制数组?

时间:2009-08-07 14:24:00

标签: c# .net sql visual-studio arrays

我正在研究一个实验项目的应用程序,我正在用C#编写它。它应该从我们用来运行测试的应用程序导出的文本文件中导入结果,到目前为止,我遇到了障碍。

我已经让程序保存了大约250个十进制值作为单维数组但是我正在尝试让数组本身能够保存在SQL数据库中以便以后可以检索数组和使用小数值构建点的图。

我需要将整个数组作为单个值导入到数据库中,因为实验室项目有几个样本,每个样本都有自己的250个左右的小数点(也将作为数组存储)

感谢您的帮助。

编辑:感谢您的快速回复,但问题在于它不仅仅来自仅有1次测试的样本。每个样本本身都进行相同的测试,不同的分贝水平超过15次。每个测试都有自己的250个结果,我们有很多标本。

此外,样本已经分配了一个唯一的ID,它将被存储为String而不是Int。我打算做的是在每个样本的DB中有一个单独的表,并且每行包含测试分贝级别的信息并存储序列化的数组...

我认为这样可行,因为我们不需要直接从数据库访问数据中的各个点;我只是使用数据库来存储数据内存,因为它有很多。我将查询数据库中的数组和其他信息,然后使用zedgraph绘制数组中的点并同时比较多个样本。

7 个答案:

答案 0 :(得分:18)

简短的回答绝对不是。这是两种完全不同的数据结构。有一些解决方法,比如将它放在blob或逗号分隔文本列中。但是,我真的很讨厌那些。它不允许您在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#数据结构?

答案 1 :(得分: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其中,samplesID = @specimenID

答案 2 :(得分:1)

只要您不访问查询中的各个值,就可以序列化数组并将其作为blob存储在数据库中。

答案 3 :(得分:1)

据推测,您可以将C#中的十进制数组序列化为字节数组,并将其保存在表的二进制字段中。您的表将有两个字段:SpecimenID,DecimalArrayBytes

或者,您可以拥有多对多类型的表,而不是将数组存储为一个部分,具有字段:SpecimenID,DecimalValue,并使用SQL,如

SELECT DecimalValue FROM Table WHERE SpecimenID = X

答案 4 :(得分: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();
}

答案 5 :(得分: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
)

插入arrayKey以获取要使用的ID。所有十进制值都将使用要存储的ID和十进制值存储到arrayValue中。一次插入一个。

当您检索它们时,您可以通过arrayID对它们进行分组,以便它们一起出现。如果您需要按照存储它们的相同顺序检索它们,请按顺序排序。

答案 6 :(得分:0)

虽然任何给定的例子可能都是不切实际的,但通过编程,你可以将任何形状的钉子设计成任何形状的孔。

您可以将数据序列化为varbinary中的存储,XML-ize存储为SQL Server XML类型等。

选择一条路线进行分析并仔细考虑。您也可以为SQL创建自定义CLR库,因此虚拟天空是限制。