在LINQ基于n层体系结构实现一个CLR存储过程:下载源代码 - 70.2 KB内容的表{A}{A2}实现CLR存储基于n -层在LINQ程序架构步骤一步{A4}{A5}{A6}{A7}{A8}{A9}{A10}简介
这篇文章是我以前的文章的顺序有关??标题="一步创建CLR存储过程步骤的"href ="CLR_Stored_Procedure.aspx"> CLR存储过程和创建它一步一步??在我以前的文章中,我解释CLR存储过程,他们的优点和缺点,以及如何贯彻落实。 CLR存储过程是非常强大的的,并给予更好的效果,同时执行复杂的逻辑,强烈的字符串操作或字符串操作,加密,访问系统资源,和档案管理等n层体系结构中的任何一个项目的发展是不同的味道并有其自身的优点和缺点。微软已经推出了LINQ,也就是说,语言集成查询,使用。NET Framework 3.0。 LINQ可以实现在多种方式,例如,与SQL,LINQ LINQ的使用对象,LINQ与DataSet和LINQ与XML,等我实现了一个简单的n层体系结构一个我公司早在几年。这是适合用于Web以及桌面应用程序。它是一个集中的n层体系结构,即,所有的对象驻留在同一个地方,在目标系统。我不声称这是最好的,但我已经实现了这种架构,因为我想至少出以下优点:它必须是安全的,易于实现,且易于部署。它必须是层的基础和至少3个分层所以,如果我们改变任何级别的代码,我们需要部署该层只DLL。单一架构为Web和桌面应用程序与标准的应用程序的性能并行发展,应是可能的,即一个开发人员可以与数据库,另一个工作与业务逻辑,而另一个可以与用户界面等。无行的SQL查询。它不能复杂,使一个新的开发人员可以很容易地设置的发展,没有经过长期训练,和现有的开发人员可以很容易地迁移从任何项目作为发展的基本架构,所有的项目都将保持不变。{A11}定义应用程序层
现在让我解释一下架构的各层。任何一个优秀的架构,将至少有三个重要的层次组成:
用户界面或表示层业务逻辑层数据层
我要解释的架构,它有五个层。任何有超过三个层次的架构,被称为n - tier结构。下面的图像会澄清:
{S0}
以下是图像显示在我们的应用程序的架构。它包含以下四个层次(见图片)和数据库,因此,共有5层。
{S1}{A12}层次的作用
让我解释一下简短的上面层:第1层:表示层:这一层负责的用户和应用程序之间的各种活动。所有的用户界面相关的逻辑驻留在这一层。这意味着Web窗体或WinForms将居住在这里。这层不直接访问数据库或数据访问层。所以,所有的数据,或表示层将通过业务逻辑层。一业务逻辑层的职权将被添加到这一层。一个单独的项目,将有这一层。第2层:业务逻辑层:业务逻辑层将执行所有的应用程序的业务逻辑。业务逻辑由两件事,即,核心业务逻辑和数据访问逻辑。数据访问逻辑隔离到不同的层,以提供更安全,更数据封装到应用程序。数据库提供更好的管理,在这一层的每个表将有一个单独的类。这个类将有各种方法。将适用于来自数据或将表示层和数据访问层的业务逻辑。一个参考数据访问层将被添加到这一层。一个单独的项目,将有这一层。第3层:数据访问层:这一层是业务逻辑的一部分,但核心业务逻辑分离。所有的数据应用程序和数据库之间的相关业务将在这里进行。这一层将创建使用LINQ。 LINQ到SQL类这里创造了所需要的所有的数据库表或存储过程将在这里拖放。这一层将有最低的手动编码。一单独的项目,将有这一层。第4层:??的CLR存储过程层:此层将负责定义各种CLR存储过程。将有一个单独的类的资料库,提供更好的管理,在这一层的每个表。这一层是没有直接关联,表示层,业务业务逻辑层,数据访问层。 CLR存储过程将被部署到SQL服务器。一个单独的项目,将有这一层。要知道什么,一个CLR存储过程是如何创建一个,请参阅我的文章??标题="创建CLR存储程序步骤一步的"href ="CLR_Stored_Procedure.aspx"CLR存储程序和创建,一步一步呢???第5层:数据库:这是维护和访问它的核心数据和对象。例如,SQL Server数据库。核心数据是在数据各种表格和对象,以维护和访问这些数据的各种表,存储过程,CLR存储过程,视图和函数,等
身体有5层,但在逻辑上,他们只有4层作为大会的CLR存储过程将数据库的一部分,在部署的时间。
添加了一个项目到另一个项目是非常简单的。只需右击项目GT,GT,点击"添加引用"。一个对话框将显示。选择"; Projectsquot;选项卡,并在项目列表中选择合适的项目。按一下"; OKquot;按钮。我们不能添加一个循环引用内的项目,例如,在我们的例子中,表示层是指业务层和业务层指的是数据访问层。现在,我们不能添加一个表示层引用数据访问层,因为它会创建一个循环引用。{A13}在一个LINQ的n层架构一步一步实现一个CLR存储过程
让我们实现一个CLR存储过程在LINQ基于n - tier结构。我所列举的所有用于创建数据库的SQL语句,创造了表,插入虚记录表等,在本文所附的脚本。应用程序开发规格。IDE:Visual Studio 2008中NET框架与SP 1:3.5语言:C#3.0数据库:微软SQL Server 2005 Express版本操作系统:Windows XP与SP 2{A14}步骤创建的架构
1。创建表示层:打开Microsoft Visual Studio 2008 GT,GT,创建新项目。一个对话框将被打开。选择时,VisualC#的GT,GT;?视窗左侧的"项目类型面板。选择"Windows窗体应用程序??在右侧的"模板??面板。给予适当的名称项目,解决方案,并选择一个位置保存该解决方案。该项目将成为我们的表现层。下面的图像会清楚。
{S2}
一个默认的名称为"Form1的形式??将创建项目。其重命名为"示范???设计如下图所示。有一个标签为标题,DataGridView控制项,并举行,即各种按钮,获取数据,插入随机记录,删除一个GroupBox控制的控制选定的记录,清除网格,并退出。下面的图像会清楚。
{S3}
以下是演示形式的代码:using System;
using System.Windows.Forms;
using BusinessLayer;
namespace ClrInNTierPresentationLayer
{
/// <summary>
/// Represents demo form for the application
/// </summary>
public partial class frmDemo : Form
{
#region Constructor
/// <summary>
/// Constructor of the application
/// </summary>
public frmDemo()
{
InitializeComponent();
}
#endregion
#region Event Handler
#region Buttons
/// <summary>
/// Handles Click event of the button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetData_Click(object sender, EventArgs e)
{
try
{
FillDataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Handles Click event of the button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnInsertRandomRecord_Click(object sender, EventArgs e)
{
try
{
CustomerSalesInformation.CustomerSalesInformationInsertRandomRecord();
FillDataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Deletes selected record from the database
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteSelectedRecord_Click(object sender, EventArgs e)
{
try
{
if (dgvData.Rows.Count > 0)
{
if (MessageBox.Show(
"Are you sure to delete selected record?",
"Confirmation", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
CustomerSalesInformation.CustomerSalesInformationDelete(
Convert.ToDouble(
dgvData.CurrentRow.Cells["ID"].Value.ToString()));
FillDataGridView();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Handles Click event of the button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClearGrid_Click(object sender, EventArgs e)
{
try
{
dgvData.DataSource = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Handles Click event of the button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExit_Click(object sender, EventArgs e)
{
try
{
Application.Exit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#endregion
#region Private Methods
/// <summary>
/// Fills the data in the DataGridView
/// </summary>
private void FillDataGridView()
{
try
{
//Filling the grid with data
dgvData.DataSource =
CustomerSalesInformation.CustomerSalesInformationGet();
//Formating the columns of the grid
dgvData.Columns[0].AutoSizeMode =
DataGridViewAutoSizeColumnMode.AllCells;
dgvData.Columns[1].AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill;
dgvData.Columns[2].AutoSizeMode =
DataGridViewAutoSizeColumnMode.AllCells;
dgvData.Columns[2].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.TopRight;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
}
}
2。创建CLR存储过程层:解决方案上右键单击,单击"添加GT,GT,新项目。一个对话框将被打开。选择数据库项目GT,GT,微软SQL Server的GT,GT,SQL在左侧的"项目类型的CLR面板??选择"SQL Server项目??在右侧的"模板??面板。项目给予适当的名称,并选择保存位置这个解决方案。该项目将成为我们的CLR存储过程层。按照我的步骤在我的文章解释??标题="CLR存储过程和创建步骤一步的"href ="CLR_Stored_Procedure.aspx"> CLR存储过程和创建一步一步来??在这个项目中添加一个CLR存储过程。下面的图像会清楚。
{S4}的
右键单击项目GT,GT,选择添加GT,GT,添加新项。将显示一个对话框,如下图所示。选择从Visual C#项目左侧"; Categoriesquot;面板。选择存储过程从右侧quot; Templatesquot;面板。给予适当的名称。
{五}
以下是代码CustomerInformationClrSP类:{C}
3。创建业务层:右键单击解决方案,点击添加GT,GT,新项目。一个对话框将被打开。选择Visual C#GT,GT;在左侧的"项目类型的Windows??面板。选择"类库呢??在右侧的"模板??面板。给予适当的名称,该项目选择位置,以保存该解决方案。这个项目将是我们的业务逻辑层。我已经加入这个项目的两个类:ConvertToDataTableCustomerSalesInformation
ConvertToDataTable类有各种方法来转换DataTable或DataSet对象的数组。CustomerSalesInformation类包括各种方法插入一条记录,删除记录,并从数据库中获取的记录。下面的图像会更清晰:
{中六}
以下是对业务层的CustomerSalesInformation类的代码。
using System;
using System.Data;
using System.Linq;
using DataAccessLayer;
namespace BusinessLayer
{
/// <summary>
/// Represents the ExecuteClr module for the Business Layer
/// </summary>
public class CustomerSalesInformation
{
#region Public Methods
/// <summary>
/// Gets records from Customer Sales Information table
/// </summary>
/// <returns>Datatable</returns>
public static DataTable CustomerSalesInformationGet()
{
try
{
object[] objData =
AccessData.Call.CustomerSalesInformationGet().
ToArray<CustomerSalesInformationGetResult>();
return ConvertToDataTable.ConvertToDatatable(objData);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// Inserts random customer in to Customer Sales Information table
/// </summary>
public static void CustomerSalesInformationInsertRandomRecord()
{
try
{
AccessData.Call.CustomerSalesInformationInsertRandomRecord();
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// Deletes record for the supplied customer id
/// </summary>
/// <param name="CustomerID">Customer ID for which
/// record is to be deleted</param>
public static void CustomerSalesInformationDelete(double CustomerID)
{
try
{
AccessData.Call.CustomerSalesInformationDelete(CustomerID);
}
catch (Exception)
{
throw;
}
}
#endregion
}
}
4。创建数据访问层:再次右键点击解决方案,点击添加GT,GT,新建项目。一个对话框将被打开。选择Visual C#中GT,GT?左侧的"项目类型的Windows面板。选择"类库呢??在右侧的"模板??面板(步骤3相同)。给予适当项目名称并选择一个位置保存该解决方案。该项目将我们的数据访问层。
右键单击"DataAccessLayer项目,选择添加GT;??GT从菜单项目的选项。如下图所示的对话框将显示。面板,并选择Visual C#项目,在左侧"类别??"的LINQ到SQL类??在右侧面板"的模板?
{七}
5。 DBML文件添加一个存储过程:?打开"服务器资源管理器和"连接到数据库"按钮点击在顶部中间服务器资源管理器窗口。这将开始一个新的向导连接到数据库。现在拖放存储程序CustomerSalesInformationDeleteCustomerSalesInformationInsertRandomRecord。不要拖放"CustomerSalesInformationGet??现在我们需要改变它。我添加AccessData类添加各种有用的方法和业务逻辑层中使用的变量。现在,我宣布LinqToSqlDataContext私人对象和暴露它使用属性的调用。下面的图像会清楚。更改连接字符串我有静态的书面声明LinqToSqlDataContext对象。
{A15}
6。添加存储过程quot; CustomerSalesInformationGetquot;:我建议不要拖放在CustomerSalesInformationGet前面的步骤,因为它是一个存储过程,其中不包含任何SELECT查询。这就是为什么如果你拖放。dbml文件,表示存储过程的方法的返回类型,而不是ISingleResult int和,所以它不会产生任何结果我们期待此存储过程。你可以看到在CS DBML文件。我要解释的解决办法是不标准的方式但它工作得很好。让我知道,如果你发现任何更好的选择。以下是解决方法步骤。步骤1:进入查询分析器,在当时这是自动创建的删除存储过程CustomerSalesInformationGet部署CLR存储过程,使用下面的SQL语句:第2步:部署CLR存储过程时所创建的存储过程具有相同的名称创建一个新的存储过程,使用下面的SQL语句:
第三步:现在到Visual Studio,并刷新存储过程"的树视图中的元素??。你可以简单地右键点击元素,然后单击"刷新??菜单选项或单击"刷新"图标在服务器资源管理器的左上角。现在拖放CustomerSalesInformationGet存储过程。dbml文件。这将创建返回类型表示存储过程的方法ISingleResult。您可以验证。CS DBML文件。这将返回按我们的期望的结果。第4步:再次去查询分析器中手动创建的存储过程"CustomerSalesInformationGet使用下面的SQL语句??。CREATE PROCEDURE [dbo].[CustomerSalesInformationGet]
AS
BEGIN
SELECT * from CustomerSalesInformation
END
步骤5:现在是到Visual Studio的菜单上右击部署选项"ClrStoredProcedureLayer项目,并单击??"??。这将CLR存储过程部署到数据库再次。现在不拖,否则,我们要重复这整个工作围绕dbml文件删除此存储过程。DROP PROCEDURE [dbo].[CustomerSalesInformationGet]
7。不断变化的连接:你必须改变在两地的连接,同时使用示例源代码。??EM> AccessData.cs??我们已宣布LinqToSqlDataContext对象的数据访问层的文件。以下澄清:
在"CLRStoredProcedureLayer??项目。说,在解决方案资源管理器的项目上右击,点击"属性??如下图所示的画面被显示出来。 "选择"数据库呢??"选项卡,更改连接字符串在"连接字符串??"选项是一个文本框和浏览按钮。private static LinqToSqlDALDataContext objLinqToSqlDALDataContext =
new LinqToSqlDALDataContext("Data Source=OM\\SQLEXPRESS;" +
"Initial Catalog=DbForClrDemo;User ID=sa;Password=airborne");
{S9}
8。保存并运行该应用程序:储存的整体解决方案。现在,您可以通过按F5运行应用程序。将打开一个对话框,如下图所示在下面的图片。点击"获取数据??按钮,它会从网格数据库和负载检索记录。 "插入随机记录??将插入随机表中的记录,并再次从数据库中检索记录和负载的电网。 "删除选定的记录呢??删除选定的记录。"清除电网??按钮清除从电网的记录。 "退出?"?"按钮将关闭并退出应用程序。以下是相同的演示。
{S10}{A16}使用的代码下载Zip文件的源代码和SQL脚本,并提取它们。 创建数据库和表";脚本创建数据库和Table.sqlquot;。插入虚拟记录的SQL语句是在同一个文件。我们要配置的应用程序与数据库的连接。在两个地方在第8步解释的应用程序在连接的变化。运行演示。现在,它应该运行没有问题。当你打quot; Dataquot;首次按钮,它会花一点时间从数据库中提取数据。现在打的"清除Gridquot;按钮和命中quot;再次获取Dataquot;按钮,你会发现速度。另外,尽量打quot;插入随机Recordquot;按钮连续多次。它插入一个数据库中的记录,并填写在每打网格,但看它的速度。这将使在Web应用程序慢一点比Windows应用程序的性能。{A17}结论
CLR存储过程可以有效地实现n层架构。
{A18}建议
参见我的另一篇文章中quot; CLR存储过程和创建它一步Stepquot。{A19}利益
在LINQ中探索IMultipleResult。{A20}历史第六届:2009年9月首次发布。