将 c# 对象存储在 sql server 数据库中
Posted
技术标签:
【中文标题】将 c# 对象存储在 sql server 数据库中【英文标题】:Store c# object in sql server database 【发布时间】:2017-12-04 09:41:22 【问题描述】:我想在 SQL Server 中存储一个 c# 对象。我考虑了以下选项:
-
读取对象字节内存流并将它们保存到数据库中(但
在 sql 中不可读)
Json,可读,易于转换,但是什么数据类型? (仅 sql 2016 的数据类型)
XML,可读性差一点,容易转换,有一个XML dataType
将 C# 对象存储在 sql 列中的最佳做法是什么?为什么? 我使用的是 SQL 2014,所以我认为选项 3 是最好的?
编辑: 注意:它不是要查询的数据,我只想将我缓存的对象加载到内存中的 c# 对象中。并在 c# 中执行一些逻辑。从另一个数据库获取数据只需要一段时间,因此我将所有数据保存在自定义对象中。因此我认为我不应该使用 ORM
【问题讨论】:
人们通常使用实体框架等 ORM 工具。通常您不仅要存储它们,还要查询。 这实际上是选项 2 和 3 之间的偏好问题。我自己更喜欢 XML,但是 XML 或 JSON 都有有效的参数。 只存储这样的动态对象 - 如果你有一个类型化的类,请使用 @AlexeyZimarev 建议的 ORM。 您不需要 JSON 数据类型。只需将其存储为nvarchar(max)
并完成... XML 速度较慢且占用更多空间
@AlexeyZimarev 如果 OP 正在序列化对象,你为什么建议 OP 之后不能读回它?如果 OP 想要另一个表而不仅仅是一列,我同意使用 ORM
【参考方案1】:
如果只是放入数据库以便稍后通过键读回,则使用 (2) 并仅使用 nvarchar(max) 字段类型。
如果是要查询的数据,那么您可能应该设计一个模式来匹配并使用 ORM。
【讨论】:
要让 ORM 在这里工作,OP 需要另一个表和一个外键,您应该在详细信息中包含这些内容 我不能使用 ORM。因为我想在内存中存储所有数据 +- 200MB 来进行分析。但这需要大约。 2 天收集 200MB 数据(来自 azure 表存储)。因此,我想将它存储在某个地方,以防我的应用程序需要重新启动并清理我的内存。 为什么 ORM 会阻止您快速存储 200MB 或快速检索它?即使这确实降低了速度,为什么不在本地机器上安装 SQL Express 并将数据存储在那里呢?这样,您可以使用 ORM 而不会出现速度问题。 这与获取数据或快速存储数据无关。这只是因为我需要对所有数据(不是子集)进行大量计算。这在 C# 中要快得多。而且我所有的逻辑都在 c# 中,包括许多用于验证逻辑的单元测试。 @CamiloTerevinto - 是的 - 对于 ORM,它可能需要多个表和大量 FK,因此“设计一个匹配的模式”。【参考方案2】:如果您对选项 B 更积极,那么您可以将任何对象[或数据类型]的 json 序列化字符串作为 NVARCHAR(MAX) 字段存储在 sql server 中。
当您想阅读它时,您可以轻松地以原始格式反序列化该字符串。
例如
Demo d1=new Demo();
//store this json into database.
string json= JsonConvert.SerializeObject(d);
// Now while reading fron db
Demo d2= JsonConvert.DeserializeObject<Demo>(json);
【讨论】:
【参考方案3】:我会选择 JSON 序列化,它只是文本,因此在存储“用户配置文件设置”或其他类型的结构数据时,您可以使用任何语言读写 JSON。现在 SQL 服务器也理解了这一点,就像 8 到 10 年前大肆宣传的 XML 支持一样,现在可以存储 JSON 并为需要更新数据的人提供大量 TSQL 支持,比如当您需要修复所有问题时所有用户的更新...
无论如何,看看这篇文章。 JSON in SQL Server 2016-2017 在往返 JSON 时,您应该测试您的属性,因为某些数据类型可能无法很好地来回转换,具体取决于日期和十进制值等区域特定设置。
【讨论】:
以上是关于将 c# 对象存储在 sql server 数据库中的主要内容,如果未能解决你的问题,请参考以下文章