见
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;


&n