3

比方說,你有各種任意類型的對象,你想存儲在一個鍵+值類型的表中。例如,密鑰可以是int,string或guid。價值是什麼?字符串,二進制或其他東西?C#:你會如何在SQL Server中存儲任意對象?

你將如何存儲和加載對象?我會想一些序列化,但是什麼樣的?


我目前所面對的一個解決方案,我用這兩種方法的類:

public T Get<T>(string key) 

public void Set<T>(string key, T value) 

在我有一個字符串列和二進制列一個表的數據庫。然後,我使用BinaryFormatter對該值進行序列化和反序列化,並使用Linq2Sql將二進制結果放入數據庫表中。但這是一個很好的解決方案嗎?目前我只敢用整數和字符串這樣簡單的值來嘗試這個。一般而言,BinaryFormatter和序列化如何與更復雜的類型(如結構和類)一起工作?特別是如果該值包含數組或列表等內容。

任何指針?


此刻我將使用它來存儲各種最後選定或鍵入等等類型的值。雖然它們可能不一定總是打字。例如,它可能是從列表中選擇值。主要的一點是,它們幾乎只是用戶的便利用品,所以不是非常重要的數據。

+2

(並以「任何指針」我不是這個意思「我應該使用任何指針」) – Svish 2009-07-13 08:41:28

+0

LOL。指針 - 可能是個好主意,具體。 – 2011-05-03 15:50:46

回答

6

如果你可以限制自己到容易映射到SQL類型的特定類型,我會試圖將它們保存在表中的不同列中,確保只填寫其中的一個。這樣,數據庫中可讀取的數據,這使得即時查詢更容易。這也意味着你不會永遠鎖定在.NET中。

有許多不同的序列化選項可用。核心框架當然是BinaryFormatterXmlSerializer; XML更便於攜帶,但佔用空間。我相信它也不太可以定製。

有第三方序列化技術,如ThriftProtocol Buffers。這些將在他們可以序列化的方面更具限制性),但更便攜。 (免責聲明:我的20%項目是協議緩衝區的C# port,所以我在這裏並不完全沒有偏見。)

您還應該考慮版本控制 - 如果更改要序列化的數據結構/解串?也許你不需要讀「舊」記錄,也許你就可以。也許你需要舊的代碼才能夠讀取「新」記錄 - 或者不是。

您的技術選擇應該真正由需求驅動。你試圖做得越一般,它就會變得越複雜 - 在你嘗試提出解決方案之前,先弄清楚你真正需要的東西。

+0

這是非常真實的。在問題中添加更具體的使用場景。 – Svish 2009-07-13 08:50:46

+1

你評論普遍使用,但你真的需要考慮到你很高興自己限制的程度。您需要達到的程度越低,解決方案就越簡單。 – 2009-07-13 09:00:39

1

當我們完成這種類型的事情後,我們將數據保存在C#中的字節數組中,並將其存儲在SQL Server中的varbinary(max)列中。

編輯基於評論

你可以嘗試有你的類,這是你的價值領域的字節數組的屬性。

0

我通常使用一個特定的列某一種價值。

EG。

  • GuidUNIQUEIDENTIFIER
  • 號碼,如intdecimalbyte等:DECIMAL
  • stringNVARCHAR
  • DateTimeDATETIME

我使用NHibernate的,有它非常容易有一個子標籤s,並將它們映射到同一個表,每個表使用特定的字段作爲其特定的值。我得到一個表是這樣的:

create table dbo.Value (
    Name NVARCHAR(80) not null, 
    Type NVARCHAR(6) not null, 
    TextValue NVARCHAR(500) null, 
    GuidValue UNIQUEIDENTIFIER null, 
    NumericValue DECIMAL(36, 18) null, 
    DateTimeValue DATETIME null 
) 

列類型可以是 'TEXT', 'GUID', 'NUMBER' 或 'DATE'。這一切都是由NHibernate完成的,但可以在沒有它的情況下輕鬆使用和操作。

此外,你可以通過使用NH any類型值(存儲主鍵和實體名稱)存儲到另一個實體的引用。

相關問題