1

これは、クラスを作成し、データベースから情報を取得するために readRecord メソッドを使用してデータベース アクセス オブジェクトを作成する方法を (仕事で) 学んだ方法です。私が興味を持っているのは、それを短縮するためのSFコミュニティの推奨事項は何ですか? readRecord コードを DAO メソッドに移動し、そこで変更するだけで、数行のコードを取り除くことができますが、それでも数百行のコードが含まれる可能性があるという問題があります...クラス、および DAO でこれらのプロパティの値を取得します。

クラスで実際に行うことは何もないことを理解しています (つまり、一連のプロパティを自動生成することはできません... Visual Studio は私が何を作成しようとしているのかを知りません!)、しかし DAO については、クラス内のすべてのプロパティをループし、それらのタイプを決定してから情報を取得する方法はありますか? 何百回も「property = dr.GetVariableType("variablename");」と入力するのは大嫌いです。何度も何度も!

コードの長さについて申し訳ありません...私が話していることのアイデアを与えるために、プロパティを6回コピーしました。

クラス

namespace MySoftware
{
    public class User
    {
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
    }
}

ダオ

namespace MySoftware
{
        public static List<User> GetUsers(int departmentId)
        {
            List<User> user = new List<User>();

            try
            {
                using (SqlConnection conn = ConnectionHelper.GetConnection("connectionString"))
                {
                    SqlCommand cmd = new SqlCommand("GetUsers", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@DeptId", departmentId);
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            users.Add(readUserRecord(dr));
                        }
                    }

                    return users;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to get users", ex);
            }
        }
    }

次に、レコードを読み取ります (これは通常、DAO の下部にあります。

    public static User ReadRegRecord(SqlDataReader dr)
    { 
        User user = new User();

        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        return user;
    }
}

たとえば、DAO/readRecord に対してこのようなことを行う方法はありますか? (これがうまくいかないことはわかっていますが、誰かが似たようなことを考えられるなら、ぜひ聞きたいです)。

        foreach (var prop in student.GetType().GetProperties())
        {
            if (prop.PropertyType == "String")
            {
                prop.Value = dr.GetString(prop.Name.ToString());
            }
            if (prop.PropertyType == "Int")
            {
                prop.Value = dr.GetInt32(prop.Name.ToString());
            }
        }
4

4 に答える 4

1

Entity FrameworkNHibernateなどの ORM を調べる必要があります。

何らかの理由でそれらがニーズに合わない場合は、T4 テンプレートを作成して、必要な正確なデータ アクセス コードを生成できるようにすることをお勧めします。T4 は、Visual Studio で非常に強力で十分に活用されていないツールです。

于 2013-10-21T21:27:53.817 に答える
0

典型的なパターンは次のとおりです。

  1. EF を使用して、既存のデータベース テーブルにマップするクラスを生成する
  2. Automapper を使用して、同じ名前のプロパティを自動的にマッピングしたり、正規化などのカスタム マッピング ロジックを適用したりします。

これにより、DataReader 列をエンティティ プロパティにマッピングする面倒なコードを省くことができます。

于 2013-10-21T21:21:02.197 に答える
0

私にはこのままでかなりよさそうです。もちろん、この作業を抽象化するツールがあると主張することもできますが、あなたはそれをやりたいので、それが私が行う方法です。

その負担を取り除くことができるものが必要な場合は、より肥大化したソリューションにDapperDotNetまたは NHibernate/EF を使用できます。

Dapper を使用すると、DAO は次のようになります。


public static List GetUsers(int departmentId)
{
    try
    {
        using (SqlConnection conn = ConnectionHelper.GetConnection("connectionString"))
        {
            return conn.Query("GetUsers", new { DeptId = departmentId }).ToList();            
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Failed to get users", ex);
    }
}
于 2013-10-21T21:22:44.223 に答える