[英]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.