在运行时根据数据集列生成类 [英] Generate class at runtime depending on dataset columns

查看:58
本文介绍了在运行时根据数据集列生成类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Silverlight项目中使用了dataservice.

CItems.cs是我的类文件,其中定义了所有类.

现在在我的数据服务中,我有了从数据库中提取数据的方法.现在我想要的是一个类,它应该基于数据集结果生成其属性.即,数据集列应作为类中的属性添加.必须创建一个具有大量每次都不使用的属性的类.

希望我的问题是可以理解的..

CRevenue是我的类.正如我们在下面看到的那样,我必须创建CRevenue类的对象然后访问其属性.我认为我的类看起来很丑陋,里面有很多属性.所以我只需要根据需要在类内生成属性. .means如果我的数据集仅返回2列,让我们说"Flag"和"Type",则我的班级应仅包含这两个属性-

I have made use of dataservice in my silverlight project.

CItems.cs is my class file in which i have defined all the classes.

now in my dataservice i have method to extract data from database..now what i want is a class should get generated along with its properties based upon the dataset result.i.e dataset columns should get added as properties in the class.so that i dont have to create a class with bulk of properties which r not used everytime.

Hope my problem is understandable..

CRevenue is my class.As we can see below i have to create object of CRevenue class and then access its properties.i think my class looks ugly with lot of properties in it.so i have to generate properties within class only as per requirement..means if my dataset returns only 2columns lets say ''Flag'' and ''Type'' then my class should contain only these two properties--

[DataContract]
    public class CRevenue
    {
        [DataMember]
        public string FLAG { get; set; }
        [DataMember]
        public string TYPE { get; set; }
    }


这样,如果下次我更改数据库表时,不必在类中添加或删除任何属性.


这是我的dataservice方法:-

[OperationContract]
公共列表< crevenue> GetExcelRevenue(字符串flagcmb,字符串类型,字符串cust_code,字符串cust_name)
{

List< crevenue> lstResult1 =新列表< crevenue>();

CRevenue objRev;

SqlConnection Conn =新的SqlConnection(Connection_String);
SqlCommand cmd;
SqlDataAdapter适配器;
cmd =新的SqlCommand("Select_RevenueChartTable",Conn);
cmd.Parameters.AddWithValue("@ flagcmb1",flagcmb);
cmd.Parameters.AddWithValue("@ type1",类型);
cmd.Parameters.AddWithValue("@ cust_code1",cust_code);
cmd.Parameters.AddWithValue("@ cust_name1",cust_name);

cmd.CommandType = CommandType.StoredProcedure;

适配器=新的SqlDataAdapter(cmd);
DataSet ds = new DataSet();
Adapter.Fill(ds);

如果(ds.Tables.Count> 0)
{
foreach(ds.Tables [0] .Rows中的DataRow dr)
{
objRev =新的CRevenue();
如果(!Convert.IsDBNull(dr ["FLAG"]))
objRev.FLAG = dr ["FLAG"].ToString();

如果(!Convert.IsDBNull(dr ["TYPE"]))
objRev.TYPE = dr ["TYPE"].ToString();


如果(!Convert.IsDBNull(dr ["CUST_CODE"]))
objRev.CUST_CODE = dr ["CUST_CODE"].ToString();

如果(!Convert.IsDBNull(dr ["CUST_NAME"]))
objRev.CUST_NAME = dr ["CUST_NAME"].ToString();

如果(!Convert.IsDBNull(dr ["TOTAL"]))
objRev.TOTAL = Convert.ToDecimal(dr ["TOTAL"]);


如果(!Convert.IsDBNull(dr ["PDC"]))
objRev.PDC = Convert.ToDecimal(dr ["PDC"]);

如果(!Convert.IsDBNull(dr ["ONE_MTH"]))
objRev.ONE_MTH = Convert.ToDecimal(dr ["ONE_MTH"]);

如果(!Convert.IsDBNull(dr ["TWO_MTH"]))
objRev.TWO_MTH = Convert.ToDecimal(dr ["TWO_MTH"]);

如果(!Convert.IsDBNull(dr ["THREE_MTH"]))
objRev.THREE_MTH = Convert.ToDecimal(dr ["THREE_MTH"]);

如果(!Convert.IsDBNull(dr ["FOUR_MTH"])))
objRev.FOUR_MTH = Convert.ToDecimal(dr ["FOUR_MTH"]);

如果(!Convert.IsDBNull(dr ["FIVE_MTH"]))
objRev.FIVE_MTH = Convert.ToDecimal(dr ["FIVE_MTH"]);

如果(!Convert.IsDBNull(dr ["SIX_MTH"]))
objRev.SIX_MTH = Convert.ToDecimal(dr ["SIX_MTH"]);

如果(!Convert.IsDBNull(dr ["ONE_YR"]))
objRev.ONE_YR = Convert.ToDecimal(dr ["ONE_YR"]);

如果(!Convert.IsDBNull(dr ["TWO_YR"]))
objRev.TWO_YR = Convert.ToDecimal(dr ["TWO_YR"]);

如果(!Convert.IsDBNull(dr ["THREE_YR"]))
objRev.THREE_YR = Convert.ToDecimal(dr ["THREE_YR"]);

如果(!Convert.IsDBNull(dr ["FOUR_YR"])))
objRev.FOUR_YR = Convert.ToDecimal(dr ["FOUR_YR"]);

如果(!Convert.IsDBNull(dr ["FIVE_YR"]))
objRev.FIVE_YR = Convert.ToDecimal(dr ["FIVE_YR"]);

如果(!Convert.IsDBNull(dr ["ABOVE_YR"]))
objRev.ABOVE_YR = Convert.ToDecimal(dr ["ABOVE_YR"]);

lstResult1.Add(objRev);
}
}
返回lstResult1;
}
希望我的问题现在可以清除


so that if next time if i change my database table i dont have to add or delete any properties within my class.


Here''s my dataservice method:-

[OperationContract]
public List<crevenue> GetExcelRevenue(string flagcmb, string type, string cust_code, string cust_name)
{

List<crevenue> lstResult1 = new List<crevenue>();

CRevenue objRev;

SqlConnection Conn = new SqlConnection(Connection_String);
SqlCommand cmd;
SqlDataAdapter Adapter;
cmd = new SqlCommand("Select_RevenueChartTable", Conn);
cmd.Parameters.AddWithValue("@flagcmb1", flagcmb);
cmd.Parameters.AddWithValue("@type1", type);
cmd.Parameters.AddWithValue("@cust_code1", cust_code);
cmd.Parameters.AddWithValue("@cust_name1", cust_name);

cmd.CommandType = CommandType.StoredProcedure;

Adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
Adapter.Fill(ds);

if (ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
objRev = new CRevenue();
if (!Convert.IsDBNull(dr["FLAG"]))
objRev.FLAG = dr["FLAG"].ToString();

if (!Convert.IsDBNull(dr["TYPE"]))
objRev.TYPE = dr["TYPE"].ToString();


if (!Convert.IsDBNull(dr["CUST_CODE"]))
objRev.CUST_CODE = dr["CUST_CODE"].ToString();

if (!Convert.IsDBNull(dr["CUST_NAME"]))
objRev.CUST_NAME = dr["CUST_NAME"].ToString();

if (!Convert.IsDBNull(dr["TOTAL"]))
objRev.TOTAL = Convert.ToDecimal(dr["TOTAL"]);


if (!Convert.IsDBNull(dr["PDC"]))
objRev.PDC = Convert.ToDecimal(dr["PDC"]);

if (!Convert.IsDBNull(dr["ONE_MTH"]))
objRev.ONE_MTH = Convert.ToDecimal(dr["ONE_MTH"]);

if (!Convert.IsDBNull(dr["TWO_MTH"]))
objRev.TWO_MTH = Convert.ToDecimal(dr["TWO_MTH"]);

if (!Convert.IsDBNull(dr["THREE_MTH"]))
objRev.THREE_MTH = Convert.ToDecimal(dr["THREE_MTH"]);

if (!Convert.IsDBNull(dr["FOUR_MTH"]))
objRev.FOUR_MTH = Convert.ToDecimal(dr["FOUR_MTH"]);

if (!Convert.IsDBNull(dr["FIVE_MTH"]))
objRev.FIVE_MTH = Convert.ToDecimal(dr["FIVE_MTH"]);

if (!Convert.IsDBNull(dr["SIX_MTH"]))
objRev.SIX_MTH = Convert.ToDecimal(dr["SIX_MTH"]);

if (!Convert.IsDBNull(dr["ONE_YR"]))
objRev.ONE_YR = Convert.ToDecimal(dr["ONE_YR"]);

if (!Convert.IsDBNull(dr["TWO_YR"]))
objRev.TWO_YR = Convert.ToDecimal(dr["TWO_YR"]);

if (!Convert.IsDBNull(dr["THREE_YR"]))
objRev.THREE_YR = Convert.ToDecimal(dr["THREE_YR"]);

if (!Convert.IsDBNull(dr["FOUR_YR"]))
objRev.FOUR_YR = Convert.ToDecimal(dr["FOUR_YR"]);

if (!Convert.IsDBNull(dr["FIVE_YR"]))
objRev.FIVE_YR = Convert.ToDecimal(dr["FIVE_YR"]);

if (!Convert.IsDBNull(dr["ABOVE_YR"]))
objRev.ABOVE_YR = Convert.ToDecimal(dr["ABOVE_YR"]);

lstResult1.Add(objRev);
}
}
return lstResult1;
}
hope my problem might b clear now

推荐答案


我认为您必须创建一个动态类或在运行时.因此您可以在运行时使用Dynamic对象创建类及其成员.使用动态对象.尝试一下.您可以在.net Framework 4.0中找到动态概念.

问候拉胡尔
Hi,
I think You have to create a dynamic class or on run time. so you can use Dynamic object to create class and its members on run time. use dynamic object. and try it. you can find dynamic concept in .net framework 4.0.

Regards Rahul


嗨!我使用了动态对象的概念..它解决了我的一些问题,但是现在我仍然面临问题..这就是我更改数据服务方法的方式-

[OperationContract]
公共列表< expandoobject> GetExcelRevenue(字符串flagcmb,字符串类型,字符串cust_code,字符串cust_name)
{

List< expandoobject> lstResult1 = new List< expandoobject>();

动态dynrevenue =新的ExpandoObject();

SqlConnection Conn =新的SqlConnection(Connection_String);
SqlCommand cmd;
SqlDataAdapter适配器;
cmd =新的SqlCommand("Select_RevenueChartTable",Conn);
cmd.Parameters.AddWithValue("@ flagcmb1",flagcmb);
cmd.Parameters.AddWithValue("@ type1",类型);
cmd.Parameters.AddWithValue("@ cust_code1",cust_code);
cmd.Parameters.AddWithValue("@ cust_name1",cust_name);

cmd.CommandType = CommandType.StoredProcedure;

适配器=新的SqlDataAdapter(cmd);
DataSet ds = new DataSet();
Adapter.Fill(ds);

DataTable dt = new DataTable();
dt = ds.Tables [0];

string [] columnname =(从dt.Columns.Cast< datacolumn>()中的colnam中选择colnam.ColumnName).ToArray();

如果(ds.Tables.Count> 0)
{
foreach(ds.Tables [0] .Rows中的DataRow dr)
{

foreach(列名中的字符串名称)
{

如果(!Convert.IsDBNull(dr [colname]))
dynrevenue.something =(dr [colname]).ToString();
}
lstResult1.Add(dynrevenue);
}
返回lstResult1;
}


现在我要面对的是..在foreach循环中,我可以使用包含数据集列名的迭代器"colname".即dr [colname],但是如何为每次迭代更改left属性?我的意思是"dynrevenue.something"在每次迭代后都会被覆盖.

希望我没事..
hey hi! i used the dynamic object concept..it solved a bit my problem but now i m still facing problem..here''s how i changed my dataservice method--

[OperationContract]
public List<expandoobject> GetExcelRevenue(string flagcmb, string type, string cust_code, string cust_name)
{

List<expandoobject> lstResult1 = new List<expandoobject>();

dynamic dynrevenue = new ExpandoObject();

SqlConnection Conn = new SqlConnection(Connection_String);
SqlCommand cmd;
SqlDataAdapter Adapter;
cmd = new SqlCommand("Select_RevenueChartTable", Conn);
cmd.Parameters.AddWithValue("@flagcmb1", flagcmb);
cmd.Parameters.AddWithValue("@type1", type);
cmd.Parameters.AddWithValue("@cust_code1", cust_code);
cmd.Parameters.AddWithValue("@cust_name1", cust_name);

cmd.CommandType = CommandType.StoredProcedure;

Adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
Adapter.Fill(ds);

DataTable dt = new DataTable();
dt = ds.Tables[0];

string[] columnname = (from colnam in dt.Columns.Cast<datacolumn>() select colnam.ColumnName).ToArray();

if (ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{

foreach (string colname in columnname)
{

if (!Convert.IsDBNull(dr[colname]))
dynrevenue.something = (dr[colname]).ToString();
}
lstResult1.Add(dynrevenue);
}
return lstResult1;
}


now what i m facing is.. inside the foreach loop i can use the iterator ''colname'' which contains the column name of the dataset. i.e dr[colname] but how can i change the left side property for every iteration? i mean ''dynrevenue.something'' gets overwritten after each iteration.

Hope i m going right..


这篇关于在运行时根据数据集列生成类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆