首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时获取DataRelation中的表

在运行时获取DataRelation中的表
EN

Stack Overflow用户
提问于 2011-09-27 16:21:07
回答 2查看 305关注 0票数 1

我试着用一个例子来说明我需要什么。

我有一个病人和订单表在数据库里。通过存储过程,患者可以有多个订单,我将获得与该患者相关的患者属性和订单,并将其放入数据集中。但是患者属性将位于一个Datatable中,而该患者的Order将位于另一个Datatable中。在前端,我需要创建一个这个关系的类。

like类患者{患者属性他已完成的订单列表}

EN

回答 2

Stack Overflow用户

发布于 2011-09-27 16:34:27

假设您正在谈论.NET框架中的System.Data.DataRelation类...

MSDN提供了有关此类属性的大量信息,包括您需要的属性。

http://msdn.microsoft.com/en-us/library/system.data.datarelation.aspx

代码语言:javascript
复制
using System.Data;

var myRelation = new DataRelation(...your data...);
DataTable parent = myRelation.ParentTable;
DataTable child = myRelation.ChildTable;
ForeignKeyConstraint foreignKey = myRelation.ChildKeyConstraint;
UniqueConstraint uniqueKey = myRelation.ParentKeyConstraint;
DataColumn[] childColumns = myRelation.ChildColumns;
DataColumn[] parentColumns = myRelation.ParentColumns;

等等。

也就是说,我建议详细说明你到底想要做什么。“所以我需要创建一个关系,并且必须从dataset创建一个类。如果不可能,有没有其他方法可以做到这一点?”你的用例是什么。这使得你很难回答你想要解决的核心问题。

票数 0
EN

Stack Overflow用户

发布于 2011-09-27 17:24:42

基于你编辑过的问题,我会坐下来问你自己,我真的需要在运行时动态地生成这些类吗?这似乎是你问题的主旨,但我认为用例相对较小。

似乎更有可能的是,您只想创建反映数据库中内容的实体类。为此,您可能会使用像Nhibernate (和许多其他的)这样的ORM,或者您甚至可以使用自己的ORM。在某种程度上,甚至强类型的DataSets也是一个选择。

如果你正在做一些一次性的事情,LINQ to SQL查询可以根据你的数据返回匿名类-完全的类型安全等。

归根结底,我仍然不确定你到底想要做什么,或者为什么?问题是“如何将数据库中的数据放入实体类”,还是“如何在两个类之间创建‘有-有’关系”,或者...?

那么就是前者了。我首先重申类之间存在关系,表之间也存在关系。您的类没有理由一定要知道表中的关系,只需要知道它们之间的关系

也就是说,像Nhibernate这样的ORM将帮助您维护表之间的关系。

在将数据从数据库中取出并放入实体方面,下面是一种简单的方法。我不会说这是理想的,甚至不是好的,但核心思想是有效的。我建议熟悉基本的操作,然后阅读更多(并提出更多问题),专注于一种适用于您的应用程序的好方法。

代码语言:javascript
复制
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace Sample
{
    public class Patient
    {
        public int PatientId { get; set; }
        public string Name { get; set; }

        private IEnumerable<Order> _orders;
        public List<Order> Orders { get { return new List<Order>(_orders); } }

        public static Patient GetById(int patientId)
        {
            using (var cn = new SqlConnection("your Patient connection string"))
            {
                cn.Open();
                using (SqlCommand cm = cn.CreateCommand())
                {
                    cm.CommandType = CommandType.Text;
                    cm.CommandText = "SELECT PatientId, Name FROM Patient WHERE PatientId = @PatientId";
                    cm.Parameters.AddWithValue("@PatientId", patientId);

                    using (SqlDataReader dr = cm.ExecuteReader())
                    {
                        if (!dr.Read())
                            return null;

                        return new Patient
                                        {
                                            PatientId = dr.GetInt32(0),
                                            Name = dr.GetString(1),
                                            _orders = Order.GetAllForPatient(patientId)
                                        };
                    }
                }
            }
        }

        public bool Save()
        {
            // save Patient to Database

            foreach (var order in _orders)
                order.Save();

            return true;
        }
    }

    public class Order
    {
        public int OrderId { get; set; }
        public int PatientId { get; set; }
        public string ServiceOrdered { get; set; }

        public static IEnumerable<Order> GetAllForPatient(int patientId)
        {
            var orders = new List<Order>();
            using (var cn = new SqlConnection("your Order connection string"))
            {
                // ... load Orders Here.
            }
            return orders;
        }

        public bool Save()
        {
            //save order to database;
            return true;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7566106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档