|
| 首页 → 程序开发 → .NET教程 |
| 阅读文章 |
使用objectdatasource结合数据绑定控件进行简单三层架构的开发 [绝版]
见 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 提供例子的项目结构。。
|
| 相关文章 |
| 发表评论 |
BK网络学院主要内容:平面设计教程,网站开发在线教程,网页制作教程,服务器教程,网络编程,数据库教程等。产业部:沪ICP备05019380号 陇ICP备05004709号 公安局:GR6201030003 Copyright © BK设计 Powered by BK网络学院 |