C# 用SQL表信息填充C结构的有效/快速方法是什么?
简而言之:我有一些数据库表数据,我想用它们填充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
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填写中介字典
将其传递给需要用值填充对象的函数
循环浏览所有对象属性,并使用反向数据映射字典指定值。
在这种情况下,例程基本上变得与对象类型无关,并且只分配找到的字段的值。它也可以抽象为基类作为方法,并继承到实际的类。为什么要使用结构?你知道他们的局限性吗?我在看光速。我甚至都不知道它的存在,我也会看看其他的。感谢所有伟大的想法!