0

我不确定这个问题的标题是否对任何人都有意义。

我的代码中的每个类都代表一个 SQL Server 数据库中的表,类属性是数据字段。我有几种方法对我编写的大多数类都是通用的,即 Populate、Update、Save 等。到目前为止还没有什么新东西。

然而,在开发周期中,甚至在我的软件实施之后,相对常见的情况是需要在其中一个表中添加一个额外的字段,从而在相应的类中添加一个额外的属性。这意味着我必须通过 Populate、Update、Save 方法来添加新字段,例如:-

private void Save()
{
   SqlConnection linkToDB = new SqlConnection(connString);
   linkToDB.Open();
   string sqlText = "INSERT INTO table (ID, Field1, Field2) VALUES (@ID, @Field1, @Field2);";
   SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
   sqlCom.Parameters.Add("@ID", SqlDbType.Int).Value = this._id;
   sqlCom.Parameters.Add("@Field1",SqlDbType.VarChar).Value = this._field1;
   sqlCom.Parameters.Add("@Field2", SqlDbType.VarChar).Value = this._field2;
   sqlCom.ExecuteNonQuery();
   linkToDB.Close();
   linkToDB.Dispose();
}

图像需要向这个我的类添加一个新字段,因此上面的 SAVE 方法需要修改 sqlText,sqlCom 添加一个新参数。需要对我的 UPDATE 和 POPULATE 方法以及具有与 Class 属性对应的完整参数集的任何其他方法进行相同的更改。

所以我的问题是这个。. .

有没有办法让一个类识别并遍历它自己的属性,并为每个属性创建正确类型的参数。我确实启动了一些代码(我知道它不会编译),但我被卡住了。这是我起床的地方。

private void Populate()
{
   SQLExpress exp = new SQLExpress();
   using (SqlConnection linkToDB = exp.DatabaseConnection)
   {
      string sqlText = "SELECT * FROM " + this._table + " WHERE ID = @ID;";
      SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
      linkToDB.Open();
      using (SqlDataReader reader = sqlCom.ExecuteReader())
      {
         while (reader.Read())
         {
             Type type = this.GetType();
             foreach (PropertyInfo propertyInfo in type.GetProperties())
             {
                 string propName = propertyInfo.Name;
                 Type propType = propertyInfo.GetType();

                 //this.propName = (propType)reader[propName];
                 //Type propType = propertyInfo.GetType();                            
             }
         }
      }
   }
} 

有没有人可以提供任何建议我如何在这里实现我的编码目标?我应该以一种完全不同的方式来解决这个问题吗?还是我想要实现的目标根本不可能?

4

2 回答 2

1

你走对了。拥有 PropertyInfo[] 后,您可以读取(或写入)该属性的值:

foreach (PropertyInfo propertyInfo in type.GetProperties())
{
  var propertyValue = propertyInfo.GetValue(this);
  propertyInfo.SetValue(this, new_value);
}

就这样。顺便说一句,就像其他人说的那样,您尝试做的事情并不像看起来那么容易,并且有很多工具已经在做这种想法:它们是 ORM。看看 EntityFramework 或 NHibernate。

于 2013-01-13T15:15:04.500 回答
0

对于这些类型的 1 对 1 CRUD 操作,我更喜欢使用 ORM。它处理所有映射,甚至可以在自动将新字段添加到数据库时更新您的模型(类)。

您是否将其作为一种选择进行了探索,也许是Entity Framework?那里有很多不同的 ORM——只要快速搜索一下。

祝你好运。

于 2013-01-13T15:07:59.553 回答