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类型值(存储主键和实体名称)存储到另一个实体的引用。

相关问题