2012-05-30 76 views
0

我與後續問題: 我有一個返回一個SqlDataReader的方法,然後我做雖然在這個SqlDataReader的,你看到波紋管:通SqlDataReader對象爲參數

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

所以,我需要填寫我的所有UserEntite的所有數據,名稱,電子郵件,身份證。但是我在用戶類中有很多方法(GetUserById,GetUserByEmai,GetAllUsers),我必須再次填充數據。

我需要創建一個私人方法來填充我的UserEntitie,並且在每個方法中我只調用我的方法FillUser並返回它。我認爲我需要將我的SqlDataReader傳遞給我的私有方法FillUser。

任何建議這樣做?

+1

無法得到問題出在哪裏。你已經決定要做什麼。 – Reniuz

回答

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 */  
    } 
} 
1

我使用的是類似類型的系統,而是路過SqlDataReader中到私有對象,而不是我將SqlConnection傳遞到對象中,並擁有執行必要工作的私有方法FillDetailsFromDb()

因此,我將有一個無參數構造函數以及一個將SqlConnection作爲參數的構造函數,而不是傳遞一個SqlDataReader。

當我創建對象時,我會傳遞一個參數(在我的情況下它是一個Guid)到對象中,我的私有方法使用它構造的SqlConnection以及一個新的SqlCommand,它接受我發送的參數公開的方法。

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數據類型時,我很可能會觸發奇怪的空值。使用類似下面的代碼,我設法避免DBNull數據類型以及利用數據庫中的列名稱。

if (!rdr.IsDBNull(rdr.GetOrdinal("firstname"))) 
{ 
    Firstname = rdr.GetString(rdr.GetOrdinal("firstname")); 
}