簡體   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