使用Daper.Net和NPGSQL将数据插入PostgreSQL jsonb列

时间:2018-07-02 06:07:08

标签: c# postgresql dapper npgsql

我正在尝试使用Dapper.Net将JSON数据插入JSONB PostgreSQL列中。

NPGSQL Documentation for JSONB给出了使用NpgsqlDbType.Jsonb数据类型的具体说明。

使用Dapper,我试图将其添加为自定义参数,但没有成功。

using (var conn = myconnection)
{
    var sql = "INSERT INTO mytable (jsonbody) VALUES (@jb);";
    dp =  new DynamicParameters();
    dp.Add("jb", stringOfJsonData, (DbType)NpgsqlDbType.Jsonb);
    await conn.ExecuteAsync(sql,dp);                    
}                

我收到的错误是 System.NotSupportedException : The parameter type DbType.36 isn't supported by PostgreSQL or Npgsql

关于如何将这两个库一起用于JSONB的任何建议?

谢谢。

2 个答案:

答案 0 :(得分:2)

似乎将SQL语句更改为以下内容可以解决该问题。

import random
import string

# create an account array object that will be used
# in xlsxwriter literal

name=["Beck","Glenn","Becker","Carl","Beckett","Samuel","Beddoes","Mick","Beecher"]


class Acc(object):

    def first_name(self):
        f_name = random.choice(name)
        return f_name

    def last_name(self):
        l_name = random.choice(name)
        return l_name

    def addy_line1(self, address):
        chars1 = string.ascii_uppercase
        chars2 = ''.join(random.choice(chars1) for i in range(4))
        return chars2 + address

    def phone_number(self, area_code):
        rand_num = random.sample(range(10), 7)
        number = str((''.join(map(str, rand_num))))
        return area_code + number


if __name__ == "__main__":
    accObj = Acc()
    accObj.first_name()
    accObj.last_name()
    accObj.addy_line1('123 West St.')
    accObj.phone_number('212')

此外,无需在参数映射中指定类型。

['Blanchet', 'Ingmar']
Traceback (most recent call last):
  File "C:/Users/Carsten/PycharmProjects/Dna_Nike/Obj_Creator.py", line 29, in <module>
test.create_accounts()
  File "C:/Users/Carsten/PycharmProjects/Dna_Nike/Obj_Creator.py", line 21, in create_accounts
    for first, last in accounts:
ValueError: too many values to unpack (expected 2)

答案 1 :(得分:1)

NpgsqlDbType和DbType是两个不同的枚举,您不能简单地将一个强制转换为另一个枚举...

您必须在其创建和发送的NpgsqlParameters上设置NpgsqlDbType属性。 IIRC有一种指定自定义参数的方法。