0

次の質問があります: SqlDataReader を返すメソッドがあり、次のようにこの SqlDataReader で While を実行します。

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{
    while(objSqlDtReader.Read()) 
    {
           UserEntitie objUserEntitie = new UserEntitie();
           objUserEntitie.Name = Convert.ToString(objSqlDtReader["name"])    
    }
}

したがって、すべての UserEntite にすべてのデータ、名前、電子メール、ID を入力する必要があります。しかし、ユーザー クラスには (GetUserById、GetUserByEmai、GetAllUsers) として多くのメソッドがあり、データを再度入力する必要があります。

UserEntitie を埋めるプライベート メソッドを作成する必要があり、各メソッドで自分のメソッド FillUser を呼び出すだけで、そのメソッドを返します。SqlDataReader をプライベート メソッド FillUser に渡す必要があると思います。

これを行うための提案はありますか?

4

2 に答える 2

1

私は同様のシステムを使用していますが、SqlDataReader をプライベート オブジェクトに渡す代わりに、SqlConnection をオブジェクトに渡し、FillDetailsFromDb()必要な作業を実行するプライベート メソッドを用意しています。

したがって、SqlDataReader を渡す代わりに、パラメーターなしのコンストラクターと、SqlConnection をパラメーターとして受け取るコンストラクターを用意します。

オブジェクトを作成したら、パラメーター (私の場合は Guid) をオブジェクトに渡します。プライベート メソッドは、パブリック メソッドに送信したパラメーターを取得する新しい SqlCommand と共に、構築された SqlConnection を使用します。 .

    private void FillDetailsFromDb(Guid p)
    {
        SqlCommand com = new SqlCommand();
        com.Connection = conn;

        com.CommandText = "spSelectProspectUsingLinkParameter";
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.AddWithValue("@linkparam", p);
        conn.Open();
        SqlDataReader rdr = com.ExecuteReader();
        ...
        etc
    }

これは、オブジェクトがまだ個別のオブジェクトとして存在でき、他の場所で使用でき、SqlDataReader を渡す必要がないことを意味します。これはあまり好きではないことがわかりました。

ちなみに、この問題を自分で調査しているときに、データベースのデータ型から .Net データ型にデータを変換する際に、奇妙な null 値を打つ可能性が高いことに気付きました。次のコードのようなものを使用して、DBNull データ型を回避し、データベースの列名を利用することができました。

if (!rdr.IsDBNull(rdr.GetOrdinal("firstname")))
{
    Firstname = rdr.GetString(rdr.GetOrdinal("firstname"));
}
于 2012-05-30T12:32:43.010 に答える
1

次のようなことができます。

class UserEntitie
{
    internal void FillFromSqlDataReader(SqlDataReader reader)
    {
        this.Name = Convert.ToString(reader["name"]);
        /* Fill your fields */
    }
}

使用法:

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{
    while(objSqlDtReader.Read()) 
    {
        UserEntitie objUserEntitie = new UserEntitie();
        objUserEntitie.FillFromSqlDataReader(objSqlDtReader);
        /* Add to a list or something */    
    }
}
于 2012-05-30T12:25:50.953 に答える