繁体   English   中英

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

[英]C#: Is it possible to store a Decimal Array in an SQL database?

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

我已经得到程序来保存大约250个十进制值作为一维数组,但后来我试图让数组本身能够保存在SQL数据库中,以便我以后可以检索数组并使用小数用于构建点的图的值。

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

谢谢你的帮助。

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

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

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

简短的回答绝对不是。 这是两种完全不同的数据结构。 有一些解决方法,比如将它放在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#数据结构?

我需要将整个数组作为单个值导入到数据库中,因为实验室项目有几个样本,每个样本都有自己的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其中,samplesID = @specimenID

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

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

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

SELECT DecimalValue FROM Table WHERE SpecimenID = X

您可以序列化数组并将其存储为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();
}

你想要两张桌子。 一个存储索引,另一个存储十进制值。 像这样的东西:

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对它们进行分组,以便它们一起出现。 如果您需要按照存储它们的相同顺序检索它们,请按顺序排序。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM