精简版行到json

甘比特

Dapper查询的结果是我们有一个Dapper行,我想将它作为json字符串存储在数据库中。不幸的是,我似乎无法正常工作。因此,让我们从一些背景信息开始。

背景信息

我们正在做一个项目,从表中提取表名,以了解必须处理的表。我们还希望它尽可能灵活,因此我们决定不对数据使用特定的POCO。

我们正在使用SQL Server 2014,因此很遗憾,我们还没有'FOR JSON'选项。

我们的代码如下所示,其中GetData是我们的实际查询:

var data = _queryHandler.Handle(new GetData(tableName.ToString(), 0), database);

从技术上讲,句柄只是连接到数据库,

conn.QueryAsync(query, parameters)

GetData看起来像这样(简化):

EXEC ('SELECT * FROM ' + @table + ')'

推理

由于表名每次都不同,因此我们不想在输出上强制使用POCO。有时是用户,有时是角色,因此,无法预测它返回什么输出。

结果

这很好。我们可以提取变量中的数据,这看起来像是IEnumerable,应该没问题。我收集我们可以循环读取它们并提取行。到目前为止,没有问题。

手头的问题

接下来要做的是将数据从所述DapperRow转换为json字符串,但是由于JsonConvert.SerializeObject失败,我似乎无法使数据表现得像json字符串。DapperRow看起来像这样(再次简化)。

{{DapperRow, Id = '07501399-b385-4d8e-bacc-gad9d04c35f7', UserName = 'test8', ApplicationId = '4721fafb-12e6-4e3c-9298-etd82d18a0cb', IsApproved = 'True', IsLockedOut = 'False', CreateDate = '26-3-2019 07:52:55' }}

我已经研究过类似的东西SqlMapper.ITypeHandler,但是我仍然没有到达那里。例如,使用TypeHandler时,我卡在destinationType上,因为我不需要特定的类型-恩,除了json对象。但这不是公认的类型。

public class JsonObjectTypeHandler : SqlMapper.ITypeHandler
{
    public void SetValue(IDbDataParameter parameter, object value)
    {
        parameter.Value = (value == null)
            ? (object)DBNull.Value
            : JsonConvert.SerializeObject(value);
        parameter.DbType = DbType.String;
    }

    public object Parse(Type destinationType, object value)
    {
        return JsonConvert.DeserializeObject(value.ToString(), destinationType);
    }
}

我唯一想到的另一件事是提取每一列并在其中构建一个类型对象,但是正如我所说,我们不想为数据使用模型/类型,因为我们希望保持数据的灵活性。

有人能指出我正确的方向吗?我觉得我似乎忽略了一些简单的事情。

马克·格雷韦尔

如果您使用的是非类型化的QueryAPI,则返回的每一行也是IDictionary<string,object>(除了dynamicAPI之外),通常可以与JsonConvert;一起使用例如,以下对我有效:

var tables = (from row in await conn.QueryAsync("select top 5 * from sys.tables")
              select (IDictionary<string, object>)row).AsList();
var json = JsonConvert.SerializeObject(tables, Formatting.Indented);
System.Console.WriteLine(json);

输出:

[
  {
    "name": "spt_fallback_db",
    "object_id": 117575457,
    "principal_id": null,
    "schema_id": 1,
    "parent_object_id": 0,
    "type": "U ",
    "type_desc": "USER_TABLE",
    "create_date": "2003-04-08T09:18:01.557",
    "modify_date": "2017-08-22T19:40:40.763",
    "is_ms_shipped": true,
    "is_published": false,
    "is_schema_published": false,
    "lob_data_space_id": 0,
    "filestream_data_space_id": null,
    "max_column_id_used": 8,
  ... etc

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL 精简版 Python

材料设计精简版附加图标

使用客户端(精简版)

Couchbase精简版拉复制失败,错误样本Couchbase移动端到端测试项目

如何使用具有不同(嵌套)结构的.net对象映射精简版行

安装精简版(1.7.2)时发生错误

检索合并的Vega(精简版)直方图的基础值?

带有材料精简版的居中表格

excel:结构化参考的精简版

如何关闭精简版服务器

精简版和多个相同命令的执行?

谷歌材料设计与材料设计精简版

材质设计精简版-更改抽屉图标颜色

使用材料设计精简版的多选选项

没有Maps Engine精简版API列出的项目

太多查询,php。创建精简版论坛引擎

在 R 中进行多项 T 检验,精简版

您如何使用Ajax和JSON以编程方式在Google Maps Engine精简版中创建图层

如何包含适当的JavaScript文件的版本(精简版还是原始版)?

使用Git / PyCharm维护Python项目的精简版和专业版

在转换位图字节缓冲区(浮点)Tensorflow-精简版的Android

Android Gradle Protobufs:如何编译完整的protobuf,而不是“精简版”?

Microsoft SQL Server CE(精简版)3.5的jdbc驱动程序

出现错误未知提供程序:e在webpack的精简版angularjs + es6中

材质设计精简版(MDL)中的水平和垂直中心卡

有没有办法获得Three.js的最低/精简版

我可以使用库的标头的精简版吗?

如何使用JavaScript显示/隐藏材质设计精简版微调器

如何在Google Play商店中向精简版应用显示推荐?