天天看點

Asp.net多層架構中的變量引用與傳遞

  

  rowsAffected = command.ExecuteNonQuery();r

  esult = (int)command.Parameters["ReturnValue"].Value;Connection.Close();

  return result;

  }

  protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )

  {

  SqlDataReader returnReader;

  Connection.Open();

  SqlCommand command = BuildQueryCommand( storedProcName, parameters );

  command.CommandType = CommandType.StoredProcedure;

  returnReader = command.ExecuteReader();

  //Connection.Close();

  return returnReader;

  protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters,string tableName )

  DataSet dataSet = new DataSet();

  SqlDataAdapter sqlDA = new SqlDataAdapter();

  sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters );

  sqlDA.Fill( dataSet, tableName );

  Connection.Close();return dataSet;

  protected void RunProcedure(string storedProcName, IDataParameter[] parameters,DataSet dataSet, string tableName )

  sqlDA.SelectCommand = BuildIntCommand( storedProcName, parameters );

  Connection.Close();

  道理很簡單,一看就懂。對于以後的操作有好處的。

  其次是要建立邏輯層,這個邏輯層基本上就是執行個體化資料層DataCore之後為表示層傳回一些DataSet,DataReader之類或是執行一些insert,update,delete之類語句。這個邏輯層也是為了區分整個Project下面不同功能子產品。比如說使用者子產品起名叫做UserModel.cs,新聞子產品叫做NewsModel.cs之類。邏輯層的另一個好處就是可以為表示層建立可以多次執行個體化的同一個對象或是方法。比如說User類,通過ID或是Username 查詢并建立的對象可以被表示層多次調用。

  最後是表示層,表示層的功能就是完成頁面邏輯。主要是接受用戶端資料然後經過簡單整合和判斷,傳遞給邏輯層處理。同樣,接收邏輯層傳遞來的Dataset或DataReader,表示在前台頁面。

  資料在各個層次之間的關系相對獨立,但是又相對連續。

  獨立性:

  對于表示層之外的幾個層,都可以把單個的對象或是方法直接拿出來放到其他工程中。因為每個曾都是為了實作模型中獨立的功能而完成的。因為在類似工程中的應用基本上不用太大改動,特别是一些相對更加原始的層,在這個示例中的DataCore就是一個典型的例子。

  連續性:

  表示層:

  邏輯層:

  {SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,4)

  };

  parameters[0].Value = UserID;

  using(DataSet UserInfor = RunProcedure("GetUserInfor",parameters,"UserInfor")){return UserInfor;

  這樣可以編譯通過,但是在執行的時候提示錯誤,類型不比對,文法上面沒有錯誤。但是錯誤出在,表示層傳進來的是一個Int32,在Sqlparameter中确是一個Int,4,本來以為這樣的變量類型都是在每一個層次中相對獨立的,但是當他們之間傳遞資料的時候,出現了問題。

  對于這個問題的解決方案有兩種,無非是更改表示層還是更改邏輯層。更改邏輯層,就要改成

  SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,32)};

  更改表示層要改為:

  DataSet UserInforRow = ObjectUser.GetUserInfor(int.Parse(Session["UserId"].ToString()));

  兩個方案中顯然是更改表示層比較合理,因為不能夠因為一個變量的傳遞更改變邏輯層中的可以被其他表示層頁面所調用的方法。

  其他類似的變量傳遞和引用也遇到類似問題,雖然幾個層次相對獨立,但是在資料的傳遞上也相對連續。

下一篇: 需要關注