通用数据库检索

时间:2018-12-31 16:10:00

标签: c# sql

我试图通过提供对象类型和表名来创建一个返回ObservableCollection的方法。

该方法应使用此信息来创建ObservableCollection,该ObservableCollection将从表中检索所有行并将其放入具有所需对象类型的先前ObservableCollection中。

public class DatabaseManager
{
    public async Task<ObservableCollection<object>> GetObjectsAsync(object object_name, string table_name)
    {
        Type type = object_name.GetType();
        IList<PropertyInfo> props = new List<PropertyInfo>(type.GetProperties());
        ObservableCollection<object> oc = new ObservableCollection<object>();

        using (SqlConnection conn = new SqlConnection(Constants.ConnectionString))
        {
            await conn.OpenAsync();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "select * from " + table_name;

                using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        object x = new object();

                        foreach (PropertyInfo prop in props)
                        {
                            // I want to create a universal object that i can add to my observable collection here.
                            object propValue = prop.GetValue(object_name, null);

                            // Code Here
                        }

                        oc.Add(x);
                    }
                }
            }
        }

        return oc;
    }
}

目标是创建一种从对象类型不特定的数据库表中获取ObservableCollection的方法。

对于任何帮助/建议,我将不胜感激,但我可能对如何执行此操作有错误的想法,但如果有可能,请告诉我。

1 个答案:

答案 0 :(得分:1)

C#是一种静态类型的语言,因此通常无法在不知道其类型的情况下构建对象。换句话说,当您这样做

object x = new object();

您实际上得到了System.Object类型的对象,没有其他属性。

有两种解决方法:

  • 使用dynamicExpandoObject -这可以让您即时添加属性,但是生成的对象需要用作dynamic,或者
  • 采用查询将产生的对象的类型-您的代码可以将表名“链接”到存储在表中的对象。如果您决定走这条路,请考虑使用轻量级的ORM库,例如StackExchange的Dapper