0

この質問の見出しが誰にとっても意味があるかどうかはわかりません。

私のコードの各クラスはSQLサーバーデータベースのテーブルを表し、クラスのプロパティはデータフィールドです。私が書いているほとんどのクラスに共通するいくつかのメソッドがあります。つまり、Populate、Update、Saveなどです。これまでのところ、新しいものはありません。

ただし、開発サイクル中およびソフトウェアの実装後でも、テーブルの1つにフィールドを追加し、対応するクラスにプロパティを追加する必要があるのは比較的一般的です。これは、新しいフィールドを追加するために、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();
}

このmyクラスに新しいフィールドを追加する必要が生じたため、上記の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 に答える