Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用SQL表信息填充C结构的有效/快速方法是什么?_C#_.net_Sql - Fatal编程技术网

C# 用SQL表信息填充C结构的有效/快速方法是什么?

C# 用SQL表信息填充C结构的有效/快速方法是什么?,c#,.net,sql,C#,.net,Sql,简而言之:我有一些数据库表数据,我想用它们填充c结构 例如: struct Phone { public int PhoneID; public string Number; } struct Patient { public Phone WorkPhone; } SQL表如下所示: Patient table: Patient ID, Patient Name, etc. Phone table: PhoneID, Number, Phon

简而言之:我有一些数据库表数据,我想用它们填充c结构

例如:

struct Phone
{
    public int PhoneID;
    public string Number;
}
struct Patient
{
    public Phone WorkPhone;
}
SQL表如下所示:

Patient table:  
    Patient ID, Patient Name, etc.  
Phone table:  
    PhoneID, Number, Phone Type etc.  
基本上,结构是SQL表的镜像

我有主键PhoneID,我正在通过select语句传递它。因此,对于患者,我只检索一行,对于电话桌,我最多检索5行,他们可以有工作、手机、家庭等

我没有一个很好的方法可以轻松地将这个表填充到结构中。我现在所做的是一个接一个的。您可以看到每个患者都有数百个变量,这是一个非常繁琐且高度代码密集的过程。有没有办法,也许我可以在变量名中有一个变量,例如,如果列名是Phone,那么它会填充Phone变量。希望这是有道理的

query = "SELECT * FROM Phone p WHERE p.StatusID = 'A' AND ObjectTypeID = 'PA' AND ObjectID = '" + PatientID.ToString() + "'";
SqlDataAdapter a1 = new SqlDataAdapter(query, dataConnection);
DataTable t1 = new DataTable();
a1.Fill(t1);
DataTableReader r1 = t.CreateDataReader();
//object value = null;
while (reader.Read())
{
    for (int i = 0; i < r1.FieldCount; i++)
    {
        if (!r1.IsDBNull(i))
        {
            if reader.GetValue(i)
            switch (r1.GetName(i))
            {
                case "PhoneID": { pr.HomePhone.PhoneID = (int)reader.GetValue(i); break; }
                case "PhoneTypeID": { pr.HomePhone.PhoneTypeID = (string)reader.GetValue(i); break; }
                case "ObjectID": { pr.HomePhone.ObjectID = (int)reader.GetValue(i); break; }
                case "ObjectTypeID": { pr.HomePhone.ObjectTypeID = (string)reader.GetValue(i); break; }

完整的ORM可能是不可能的,但是您可以使用反射将数据表中的值映射到对象。或者,您也可以求助于这样的方法。

可能是您需要一个类似ORM的工具,或者


如果它们有点过火,可以查看一个新的类似于ORM的迷你库,比如。

一般来说,可变结构是一个非常糟糕的主意

你应该考虑使用一个可用的ORM,它专门用于这个目的。 若你们执意要做一些定制的东西,那个么一般的想法是相当简单的

使用反射检查给定类型 使用动态编译或表达式将类型字段/属性绑定到数据读取器字段名称 奇迹发生了
除了@Bevan I提供的答案之外,Entity Framework 4.1 EF 4.1与其他版本相比有很大的不同,它的示例模板是温柔的.NET或Code Smith。

Dapper stackoverflows轻量级对象映射器似乎是一个很好的候选者。到目前为止,在一些项目中使用了它,并且非常喜欢它。简单、快速、无痛

除非需要结构,否则我建议切换到类


你可以用字典。逻辑是:

while (reader.Read())
            {
                Dispute disp = new Dispute();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    if (!reader.IsDBNull(i))
                    {
                        //Getting a property name associated to filed name
                        string mappedProperty = dataMapping[reader.GetName(i)];
                        //Getting handle to the property
                        PropertyInfo fld = typeof(Dispute).GetProperty(mappedProperty);
                        //Setting property value to field value
                        fld.SetValue(disp, reader.GetValue(i));
                    }
                }
            }
在这种情况下,您只需要一个字典数据映射,它将字段名与对象中的属性相关联。我就是这样做的。它可以处理任何字段结构,只需对 代码-只需要修改字典

不过,更好的方法是将其反转,并使用对象结构作为驱动程序

用fieldName、filedValue填写中介字典 将其传递给需要用值填充对象的函数 循环浏览所有对象属性,并使用反向数据映射字典指定值。
在这种情况下,例程基本上变得与对象类型无关,并且只分配找到的字段的值。它也可以抽象为基类作为方法,并继承到实际的类。

为什么要使用结构?你知道他们的局限性吗?我在看光速。我甚至都不知道它的存在,我也会看看其他的。感谢所有伟大的想法!