【问题标题】:C#: Is it possible to store a Decimal Array in an SQL database?C#:是否可以在 SQL 数据库中存储十进制数组?
【发布时间】:2009-08-07 14:23:59
【问题描述】:

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

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

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

感谢您的帮助。

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

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

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

【问题讨论】:

  • 关于编辑,听起来您在提出问题之前已经下定决心。鉴于投票率最高的回复告诉你“不要这样做”,如果你不听,为什么还要征求意见?
  • 简单。有一个具体的问题:你如何做 X? “投票最高”的答案都是“不要做 X”。这不是忽视建议——答案并不能回答问题。
  • 这是一个很好的例子,说明为什么不应允许科学家和工程师靠近数据库 ;-)
  • @Greg Beech:问题是我是一名高中生,在实验室做志愿者并为一个项目制作程序。存储它的方法基本上是由在我真正开始研究该程序之前的科学家决定的,我说的任何话都不能真正改变他们的想法...@nader:谢谢 man =D

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


【解决方案1】:

简短的回答绝对不是。这是两种完全不同的数据结构。有一些变通方法,例如将它放在一个 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 好答案。我冒昧地在查询中添加了“order by”子句,因为我假设数据点的顺序在这种情况下很重要,尽管 autoid 很可能会被设置为集群 PK,而且很可能数据库将使用它对结果进行排序,除非您指定,否则无法保证排序。
  • 好吧,我不需要在服务器级别做数学什么的;我只需要能够查询数据库,这样就不需要将这些东西存储在计算机的内存中,因为有太多的样本和测试在它们上面运行。
  • 每条记录的数组不一样怎么办?如果相同,问题就出在表的结构上。
  • @backslash: 现在怎么办?我完全不知道你在问什么。 @Unk: 这仍然为您提供了最干净的方式来存储您的记录。它是人类可读的,如果需要,您可以快速验证结果。
  • 我不打算为每个样本创建一个单独的 250 行表,我计划为每个样本创建一个单独的表,然后每个表中的唯一 ID 将是执行测试的 ID因为对所有样本都进行了相同的测试。该表最终将有 15 行,其中(可能)将实际数据的序列化数组作为字段。
【解决方案2】:

我需要导入整个数组 作为一个单一的值进入数据库 虽然因为实验室项目有 几个标本,每个都有自己的 一组 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)

查询数据非常简单:

从 SpecimenData 中选择 * 样本 ID = @specimenID

【讨论】:

  • 问题是实验不仅仅是一个样本和一个值;有多个测试在同一个样本上运行,并有自己的结果,并且有不同的样本组(但这包含在样本 ID 中)......有组号,记录号,采集持续时间,分贝水平......它会对我来说太复杂了,不能单独存储每个值,因为我需要用 zedGraph 和所有东西来绘制它。
【解决方案3】:

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

【讨论】:

  • eh:他们现在可能不需要它,但给它足够的时间,他们会想要查询单个测量值。事情总是这样。把这些放在他们自己的桌子上肯定更好。
  • 我完全同意乔尔的观点。如果它是一个关系数据库,那么就像一个关系数据库一样使用它。
  • @Joel:我同意在数据库中正确地做是要走的路。在这种情况下,OP 可能只是不知道更好。但我不同意它总是需要,他们想要查询单个值。如果需要单独查询,以后可以随时调整数据。最后,数据库中允许的修改可能会受到限制(在这种情况下不太可能)
【解决方案4】:

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

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

SELECT DecimalValue FROM Table WHERE SpecimenID = X

【讨论】:

  • 这是我要建议的解决方案。
【解决方案5】:

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

【讨论】:

  • 序列化是他要找的,但我不认为这是解决这个问题的最佳答案。
  • 是的,我只是想回答他的具体问题,而不是试图重新设计他的解决方案。
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多