峰峦@叠嶂 2024-08-04 17:29 采纳率: 97.6%
浏览 6
已结题

从不同数据库关联查询的内容显示;

若是想实现,根据某个查询条件,比如表头的“产品药监码”,查询出一个数据库内的“产品批号、销售出库单号”等相关信息,再根据所查询出的“销售出库单号”,查询出另一个数据库内,所对应的业务员,最后一起显示在一个数据表里面,用WINFORM的DataGridView显示出来,请问在C#内怎么实现,请说一下思路和方法,及代码示例,谢谢;

  • 写回答

2条回答 默认 最新

  • wanghui0380 2024-08-05 09:42
    关注

    始终丢不开dt。

    那就dt把,dt可以设置父子级联关系。所以你想怎么查就怎么查,查好了设置级联关系即可。
    我没数据,就直接手动模拟

    // 创建 DataSet
            DataSet dataSet = new DataSet();
    
            // 创建父表
            DataTable tableParent = new DataTable("Parents");
            tableParent.Columns.Add("ParentID", typeof(int));
            tableParent.Columns.Add("ParentName", typeof(string));
    
            // 创建子表
            DataTable tableChild = new DataTable("Children");
            tableChild.Columns.Add("ChildID", typeof(int));
            tableChild.Columns.Add("ParentID", typeof(int)); // 外键
            tableChild.Columns.Add("ChildName", typeof(string));
    
            // 添加数据
            tableParent.Rows.Add(1, "Parent 1");
            tableParent.Rows.Add(2, "Parent 2");
    
            tableChild.Rows.Add(1, 1, "Child 1-1");
            tableChild.Rows.Add(2, 1, "Child 1-2");
            tableChild.Rows.Add(3, 2, "Child 2-1");
    
            // 将表添加到 DataSet
            dataSet.Tables.AddRange(new DataTable[] { tableParent, tableChild });
    
            // 创建 DataRelation
            DataRelation relation = new DataRelation("ParentChild",
                tableParent.Columns["ParentID"], tableChild.Columns["ParentID"]);
            dataSet.Relations.Add(relation);
    
            // 绑定到 DataGridView
            dataGridView1.DataSource = dataSet;
            dataGridView1.DataMember = "Parents";
            dataGridView1.AutoGenerateColumns = true;
    
    

    这样的2个表都在同一个dataset里,而且他们具备级联关系。所以可以直接在datagridview里显示,默认情况datagridview会显示成带层级的,也就是前面有个+号,点击+号展开子数据

    如果你需要类似left join那种效果。可以自己在写个函数手动创建一个dt,(其实也有办法自动创建,不过我不想介绍了,已经跟你说过很多次了,dt这东西该扔就扔,不可惜。这些玩意你不提我都不愿意想,他早就我脑袋不知道啥角落里吃灰,所以我不会在特别强调这类方法,也不会特别推荐这些东西,至于发的这些代码是chartgpt生成的,我自己都快10年没有碰dt了,也更不想在脑袋里去放这种已经用不上的技术)

    //如果要left join效果,则根据关系从新创建一个
    private DataTable CreateFlattenedTable(DataSet dataSet)
    {
        DataTable flatTable = new DataTable();
        // 添加所需的列
        flatTable.Columns.Add("ParentID", typeof(int));
        flatTable.Columns.Add("ParentName", typeof(string));
        flatTable.Columns.Add("ChildID", typeof(int));
        flatTable.Columns.Add("ChildName", typeof(string));
    
        foreach (DataRow parentRow in dataSet.Tables["Parents"].Rows)
        {
            var childRows = parentRow.GetChildRows("ParentChild");
            if (childRows.Length == 0)
            {
                flatTable.Rows.Add(parentRow["ParentID"], parentRow["ParentName"], DBNull.Value, DBNull.Value);
            }
            else
            {
                foreach (var childRow in childRows)
                {
                    flatTable.Rows.Add(
                        parentRow["ParentID"], parentRow["ParentName"],
                        childRow["ChildID"], childRow["ChildName"]);
                }
            }
        }
    
        return flatTable;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 已采纳回答 8月8日
  • 创建了问题 8月4日

悬赏问题

  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序