2016-04-21 70 views
0

我有多个存储特效,我用来检索各种数据。这些特效返回不同的字段,我想知道是否有一种方法来动态检索字段,类型和数据,所以我可以将它们传递给模型?使用C#,有没有办法从查询中检索所有字段,类型和数据?

using (var dr = SqlHelper.ExecuteReader(
        dbConnectionString, 
        CommandType.Text, 
        sql, 
        sqlParams 
       )) 
       { 
        while (dr.Read()) 
        { 
         var Data = new Results 
         { 
          Name = (string)dr["Name"], 
          Value = (double)dr["Value"], 
          Timestamp = (DateTime)dr["DateTime"] 
         }; 
         DataItems.Add(Data); 
        } 
       } 

我正在寻找一种方式来改变,而部分和动态,那里的结果将通过现场,类型和数据设置为结果模型,同时部分。这样我就不必制定具体的案例。该模型设置为采取所有可能的结果,因此只要假设返回的数据将与结果模型一起工作。

+5

这听起来像你正在创建一个自定义ORM的道路,即使你可能还没有意识到这一点。我会后退一步,检查这是否真的是你想要做的事情。你评估过现有的框架,如EF,NHibernate等吗?如果不是为什么?这些都是已经解决的问题,有什么理由可以通过更好的团队重新发明自己(没有冒犯意味,他们比我们大多数人(我也是)在这个领域里更胜一筹,毕竟这是他们的专长)? – Igor

+0

C#中真的没有办法将结果传递给模型,并让模型填充字段吗?而不是列出每个列类型只是传递结果本身? (即var Data = new Results(dr))? –

+0

你要么必须建立通用映射(tranlation)代码翻译数据库结果模型或每个模型(或模型厂)必须要采取一个DataReader或DataRow中,并从数据库填充自身的能力。前几个例子已经在各种ORM中做过无数次了,如果你想要例子,我建议你找一个你喜欢的开源代码,并看看源代码。第二种是重复代码,但每个模型/工厂负责获取适当的字段并将其分配给模型上的相应属性。 – Igor

回答

1

可以使用的DataReader的GetSchemaTable功能retrirving申请数量和性质鉴别仪表,这是一个如何。如果我明白你的问题使用

static void GetSchemaInfo(SqlConnection connection) 
{ 
    using (connection) 
    { 
     SqlCommand command = new SqlCommand(
      "SELECT CategoryID, CategoryName FROM Categories;", 
      connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 
     DataTable schemaTable = reader.GetSchemaTable(); 

     foreach (DataRow row in schemaTable.Rows) 
     { 
      foreach (DataColumn column in schemaTable.Columns) 
      { 
       Console.WriteLine(String.Format("{0} = {1}", 
        column.ColumnName, row[column])); 
      } 
     } 
    } 
} 

你看到这个MSDN page

+0

这并不解决将返回的数据库列/字段映射到对象的OP问题。您需要反思正在构建的对象,然后映射该对象上的属性和列名称之间的信息,并根据该映射最终分配值。本质上,OP要求重新创建ORM的功能,而不是仅仅获取列名。 – Igor

0

铁道部信息的示例代码正确地说,您需要使用动态数据从数据库中进行检索,而不是在结果集中随时查找。作为这种方法的一个例子,存在MassiveMicroORM,其允许将结果集读入动态变量并且读取可能存在的任何类型的数据。

相关问题