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