|
|
见
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
 Code
 /**//**********************************************************************************
*
* 此文件代码由 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
 Code
 /**//**********************************************************************************
*
* 此文件代码由 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 提供例子的项目结构。。
|