阅读文章

使用objectdatasource结合数据绑定控件进行简单三层架构的开发 [绝版]

[日期:2008-04-23] 来源:  作者: [字体: ]

    
  见
  http://www.cnblogs.com/mFrog/archive/2008/04/18/1160521.HTML
  使用objectdatasource结合数据绑定控件进行简单三层架构的开发
  贴后感,因为我上一次没有把 NicPetShop 的这种特性显示出来,NicPetShop 对这 ObjectDataSouce 支持得很好。
  
  --------------------------------------------------------------------------------
  
  对于B/S架构的三层架构的开发,可能很多的人都已经了解的是比较清楚的。哪么我在这里用的是最简单的三层架构。UI + BLL + DAL + Model.
  
  (图就略了)
  
  引用原文:
  从 05 出来以后由于功能明显比 03 夸张了很多,所以在开发的时候也就很方便。其中以数据的显示最为明显。通过 sqldatasource 可以几乎一行代码都不需要写,就能在GridView中显示出来数据,并且进行增删查改的操作,但是我个人总感觉这样做是有问题的。因为使用 sqldatasource,就明显的破坏了 3 层架构的基本改变。哪么微软在05当中,很重点的推出了 objectdatasource 这个东西,就是专门用来结合三层架构开发的一个数据源绑定控件。 在层次之间传递的也是object,这样相对来说就比较好一些。
  
  页面代码为:
  add.ASPx
  <ASP:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="ObjectDataSource1"
  DefaultMode="Insert">
   <Fields>
   <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
   <asp:TemplateField HeaderText="Remark" SortExpression="Remark">
   <InsertItemTemplate>
   <asp:TextBox ID="TextBox1" runat="server" Height="134px" Text='<%# Bind("Remark") %>' TextMode="MultiLine" Width="286px"></asp:TextBox>
   </InsertItemTemplate>
   </asp:TemplateField>
   <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" SortExpression="Id" />
   <asp:CommandField ButtonType="Button" ShowInsertButton="True" />
   </Fields>
  </asp:DetailsView>
  <ASP:ObjectDataSource ID="ObjectDataSource1" runat="server" InsertMethod="Insert"
   SelectMethod="GetItem" TypeName="Test.BLL.Source">
   <SelectParameters>
   <asp:Parameter Name="Id" Type="Int32" />
   </SelectParameters>
   <InsertParameters>
   <asp:Parameter Name="Id" Type="Int32" />
   <asp:Parameter Name="Name" Type="String" />
   <asp:Parameter Name="Remark" Type="String" />
   </InsertParameters>
  </asp:ObjectDataSource>
  update.ASPx
  <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="ObjectDataSource1" DefaultMode="Edit">
   <Fields>
   <asp:TemplateField HeaderText="Id" SortExpression="Id">
   <EditItemTemplate>
   <asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
   </EditItemTemplate>
   </asp:TemplateField>
   <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
   <asp:TemplateField HeaderText="remark" SortExpression="remark">
   <EditItemTemplate>
   <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("remark") %>' Height="109px" TextMode="MultiLine" Width="239px"></asp:TextBox>
   </EditItemTemplate>
   </asp:TemplateField>
   <asp:CommandField ButtonType="Button" ShowEditButton="True" />
   </Fields>
  </asp:DetailsView>
  <ASP:ObjectDataSource ID="ObjectDataSource1" runat="server"
   SelectMethod="GetItem" TypeName="Test.BLL.source" UpdateMethod="Update">
   <SelectParameters>
   <asp:QueryStringParameter DefaultValue="0" Name="Id" QueryStringField="id" Type="Int32" />
   </SelectParameters>
   <UpdateParameters>
   <asp:Parameter Name="Id" Type="Int32" />
   <asp:Parameter Name="Name" Type="String" />
   <asp:Parameter Name="remark" Type="String" />
   </UpdateParameters>
  </asp:ObjectDataSource>
  
  封装的代码:
  
  
  DBUtility.csproj
  
  SqlHelper.cs
  
  /**//**********************************************************************************
   *
   * 此文件代码由 NicPetShop.exe 自动生成,您没有必要修改它或删除它
   * NicPetShop.exe 能将数据库的关系映射到 c#,让您使用更方便,您无需要担心它的性能
   * NicPetShop.exe 将永久免费给大家使用
   *
   * Author: Nic
   * QQ: 2881099
   * Email: kellynic@163.com
   * 帮助: http://www.kellynic.com/default.ASP?tag=NicPetShop
   *
   **********************************************************************************/
  using System;
  using System.Data;
  using System.Data.SqlClient;
  using System.Threading;
  
  namespace Test.DBUtility {
   public abstract class SqlHelper {
  
   static readonly Logger Log = Logger.dbutility_sqlhelper;
  
   static void LoggerException(SqlCommand cmd, Exception e) {
   if (e == null) return;
   string log = "〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓" + cmd.CommandText + "\r\n";
   foreach (SqlParameter parm in cmd.Parameters) {
   log += Lib.PadRight(parm.ParameterName, 20) + " = " + Lib.PadRight(parm.Value == null ? "NULL" : parm.Value, 20) + "\r\n";
   }
   Log.Fatal(log + "\r\n\r\n", e);
   cmd.Parameters.Clear();
   cmd.Connection.Close();
   throw e;
   }
  
   override#region override
   public static DataSet ExecuteDataSet(string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteDataSet(null, CommandType.Text, cmdText, cmdParms);
   }
   public static DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteDataSet(null, cmdType, cmdText, cmdParms);
   }
   #endregion
   public static DataSet ExecuteDataSet(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   DataSet ds = new DataSet();
  
   SqlCommand cmd = new SqlCommand();
   SqlDataAdapter sda = new SqlDataAdapter(cmd);
   PrepareCommand(cmd, conn, cmdType, cmdText, cmdParms);
   Exception ex = Lib.Trys(delegate() {
   if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
   try {
   sda.Fill(ds);
   } catch {
   if (!Lib.IsWeb) Thread.CurrentThread.Join(1000);
   throw;
   }
   }, Lib.IsWeb ? 1 : 60);
   cmd.Connection.Close();
   LoggerException(cmd, ex);
   cmd.Parameters.Clear();
   return ds;
   }
  
   override#region override
   public static int ExecuteNonQuery(string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteNonQuery(null, CommandType.Text, cmdText, cmdParms);
   }
   public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteNonQuery(null, cmdType, cmdText, cmdParms);
   }
   #endregion
   public static int ExecuteNonQuery(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   SqlCommand cmd = new SqlCommand();
   PrepareCommand(cmd, conn, cmdType, cmdText, cmdParms);
   int val = 0;
   Exception ex = Lib.Trys(delegate() {
   if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
   try {
   val = cmd.ExecuteNonQuery();
   } catch {
   if (!Lib.IsWeb) Thread.CurrentThread.Join(1000);
   throw;
   }
   }, Lib.IsWeb ? 1 : 60);
   cmd.Connection.Close();
   LoggerException(cmd, ex);
   cmd.Parameters.Clear();
   return val;
   }
  
   override#region override
   public static IDataReader ExecuteReader(string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteReader(null, CommandType.Text, cmdText, cmdParms);
   }
   public static IDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteReader(null, cmdType, cmdText, cmdParms);
   }
   #endregion
   public static IDataReader ExecuteReader(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   SqlCommand cmd = new SqlCommand();
   PrepareCommand(cmd, conn, cmdType, cmdText, cmdParms);
   SqlDataReader dr = null;
   Exception ex = Lib.Trys(delegate() {
   if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
   try {
   dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
   } catch {
   if (!Lib.IsWeb) Thread.CurrentThread.Join(1000);
   throw;
   }
   }, Lib.IsWeb ? 1 : 60);
   LoggerException(cmd, ex);
   return dr;
   }
  
   override#region override
   public static object ExecuteScalar(string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteScalar(null, CommandType.Text, cmdText, cmdParms);
   }
   public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   return ExecuteScalar(null, cmdType, cmdText, cmdParms);
   }
   #endregion
   public static object ExecuteScalar(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
   SqlCommand cmd = new SqlCommand();
   PrepareCommand(cmd, conn, cmdType, cmdText, cmdParms);
   object val = null;
   Exception ex = Lib.Trys(delegate() {
   if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
   try {
   val = cmd.ExecuteScalar();
   } catch {
   if (!Lib.IsWeb) Thread.CurrentThread.Join(1000);
   throw;
   }
   }, Lib.IsWeb ? 1 : 60);
   cmd.Connection.Close();
   LoggerException(cmd, ex);
   cmd.Parameters.Clear();
   return val;
   }
  
   private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
   cmd.CommandType = cmdType;
   cmd.CommandText = cmdText;
   cmd.Connection = conn == null ? ConnectionManager.GetConnection() : conn;
  
   if (cmdParms != null) {
   foreach (SqlParameter parm in cmdParms) {
   if (parm == null) continue;
   if (parm.Value == null) parm.Value = DBNull.Value;
   cmd.Parameters.Add(parm);
   }
   }
   }
   }
  }
  ConnectionManager.cs
  /**//**********************************************************************************
   *
   * 此文件代码由 NicPetShop.exe 自动生成,您没有必要修改它或删除它
   * NicPetShop.exe 能将数据库的关系映射到 c#,让您使用更方便,您无需要担心它的性能
   * NicPetShop.exe 将永久免费给大家使用
   *
   * Author: Nic
   * QQ: 2881099
   * Email: kellynic@163.com
   * 帮助: http://www.kellynic.com/default.ASP?tag=NicPetShop
   *
   **********************************************************************************/
  using System;
  using System.Data;
  using System.Data.SqlClient;
  using System.Threading;
  using System.Collections.Generic;
  using System.Configuration;
  
  namespace Test.DBUtility {
   /**//// <summary>
   /// 数据库链接管理器
   /// </summary>
   public abstract class ConnectionManager : IDisposable {
  
   private static string _connectionString = null;
   /**//// <summary>
   /// SqlConnection 连接池,每一线程对应一个 SqlConnection
   /// </summary>
   public static Dictionary<int, List<SqlConnection>> ConnectionPool = new Dictionary<int, List<SqlConnection>>();
  
   /**//// <summary>
   /// 获取当前线程的 SqlConnection 连接
   /// </summary>
   /// <returns>返回一个 SqlConnection,注意:使用完毕后 Close 即可,请不要 Dispose 或相关方法消毁此 SqlConnection 的引用,否则将出现不可预料的错误</returns>
   public static SqlConnection GetConnection() {
  
   if (string.IsNullOrEmpty(_connectionString)) {
   string key = "sspConnectionString";
   _connectionString = ConfigurationManager.ConnectionStrings[key] == null ? null : ConfigurationManager.ConnectionStrings[key].ConnectionString;
  
   if (_connectionString == null) throw new ArgumentNullException(key, string.Format("未定义 Web.Config 里的 ConnectionStrings 键 '{0}' 或值不正确!", key));
   }
  
   int tid = Thread.CurrentThread.ManagedThreadId;
   if (!ConnectionPool.ContainsKey(tid)) ConnectionPool.Add(tid, new List<SqlConnection>());
   SqlConnection conn = ConnectionPool[tid].Find(delegate(SqlConnection conn2) {
   return conn2 != null && conn2.State == ConnectionState.Closed;
   });
   if (conn == null) {
   conn = new SqlConnection(_connectionString);
   ConnectionPool[tid].Add(conn);
   }
  
   return conn;
   }
  
   IDisposable 成员#region IDisposable 成员
   public void Dispose() {
   ConnectionPool.Clear();
   }
   #endregion
   }
  }
  
  更多请参考 NicPetShop 提供例子的项目结构。。  


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:关于转换QQ消息中系统表情,自定义表情和截图的函数
下一篇:平台架构--用户系统
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款