【问题标题】:How to gets text array data from postgres to c#如何从postgres获取文本数组数据到c#
【发布时间】:2020-12-17 15:28:54
【问题描述】:

我已经从 postgres 调用了函数,输出就像

我使用 windows 窗体显示数据,我使用 npgsql 连接 c# 和 postgres d.b。 我的 BL 类函数如下所示

    public List<User> view_data()
    {

        NpgsqlDataReader rdr;
        List<User> lstUser = new List<User>();

        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }
        NpgsqlCommand command = new NpgsqlCommand("select * from public.get_user_details", con);

        rdr = command.ExecuteReader();

        while (rdr.Read())
        {
           
            lstUser.Add(new User()
            {
                id = rdr.GetInt16(Convert.ToString(rdr["id"])),
                roleName = rdr.GetString(Convert.ToString(rdr["rolename"])),
                firstName = rdr.GetString(rdr.GetOrdinal("firstname")),
                lastName = rdr.GetString(rdr.GetOrdinal("lastname"))
       
        });

        }
        rdr.Close();

        return lstUser;

    }

在角色名上出现错误。错误是无法将字符串转换为字符串[]

下面给出了我的用户类

public class User
{
    public int id
    { get; set; }
    public string firstName
    { get; set; }
    public string lastName
    { get; set; }
    public string email
    { get; set; }
    public string userName
    { get; set; }
    public string[] roleName
    { get; set; }

}

我的问题是如何使用 npqsql 数据阅读器在 c# 中分配文本数组数据?

在这个区域出错 => roleName = rdr.GetString(Convert.ToString(rdr["rolename"]))

postgres 给出角色名称输出是文本数组。 IE;在一列中包含多个值。 IE; {管理员,用户}。所以需要使用数据阅读器将postgres文本数组设置成c#格式。

【问题讨论】:

  • 你需要把public string[] roleName { get; set; }改成public string roleName { get; set; }
  • 如你所说,我已将 roleName[] 更改为 roleName,但出现错误 => IndexOutOfRangeException: Field not found in row: System.String[]
  • postgres 给出角色名称输出是文本数组。 IE;在一列中包含多个值。 IE; {管理员,用户}。因此需要使用数据阅读器将文本数组设置为 c# 格式。你能帮我解决这个问题吗?
  • 我很熟悉 1. C# 中的直接 SQL 访问(我建议使用类似实体框架的 ORM)和 2. Postgres。但根据我的 SQL 经验,一个单元格中的多个值会破坏第一个范式,而应将其替换为与“角色”表的关系

标签: c# postgresql ado.net


【解决方案1】:

保持您的代码不变,但用下面的这个替换 SQL 查询。它将roleName 数组的内容连接(聚合)成一个逗号分隔的列表字符串。所以不是

select * from public.get_user_details

使用这个:

select 
  id,
  firstname,
  lastname,
  array_to_string(rolename, ',') as rolename
from public.get_user_details

为了便于阅读,我添加了新行,您可以删除它们。顺便说一句,生产代码中的select * 往往会带来麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2013-05-24
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多