All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHPUnit袖珍指南之PHPUnit的目的_php资料_编程技术
去除正文中的html标记,但是又想保留其中的<br>_[Asp.Net教程]
delphi状态栏中加入图标实例
ASP.NET中利用DataGrid实现高效分页_[Asp.Net教程]
delphi获取当前目录
Asp.net,Ajax,学习笔记7,客户端访问WebService(中)_[Asp.Net教程]
HTML语言剖析(八)表单标记_[Html教程]
如何在SQL,Server中保存和输出图片_[SQL,Server教程]
DropDownList无限级分类(灵活控制显示形式)_[Asp.Net教程]
sql删除记录_[SQL,Server教程]
Reading number is top 10 pictures
Group of female porn in 《westwards》, uninhibited woman threatened to not the bottom line1
美丽的少女1
30 beautiful school beauty2
美女浴室写真1
毛俊杰-能量永动机
The terra-cotta warriors1
Household design of gorgeous series
奇趣的世界记录1
The money of more than 100 countries and regions5
漂亮的跳舞妹妹1
Download software ranking
圣殿祭司的ASP.NET.2.0.开发详解-使用C#
美女写真1
Be there or be square
在线棋牌游戏3.05版
White deer villiage
Adobe Flash Player(IE) 10.0.32.18 浏览器专用的FLASH插件
DreamWeaver8
Unix video tutorial11
Twenty piece of palm leaf
电车之狼R
归海一刀 published in(发表于) 2014/1/30 1:02:47 Edit(编辑)
LINQ体验(14)——LINQ,to,SQL语句之存储过程_[Asp.Net教程]

LINQ体验(14)——LINQ,to,SQL语句之存储过程_[Asp.Net教程]

LINQ体验(14)——LINQ to SQL语句之存储过程_[Asp.Net教程]

存储过程


在我们编写程序中,往往需要一些存储过程,在LINQ to SQL中怎么使用呢?也许比原来的更简单些。下面我们以NORTHWND.MDF数据库中自带的几个存储过程来理解一下。


1.返回数量


在数据库中,有名为Customers Count By Region的存储过程。该存储过程返回顾客所在"WA"区域的数量。


ALTER PROCEDURE [dbo].[NonRowset]
(@param1 NVARCHAR(15))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @count int
SELECT @count = COUNT(*)FROM Customers
WHERECustomers.Region = @Param1
RETURN @count
END

我们只要把这个存储过程拖到O/R设计器内,它自动生成了以下代码段:


[Function(Name="dbo.[Customers Count By Region]")]
public int Customers_Count_By_Region([Parameter
(DbType="NVarChar(15)")] string param1)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
return ((int)(result.ReturnValue));
}

我们需要时,直接调用就可以了,例如:


int count = db.CustomersCountByRegion("WA");
Console.WriteLine(count);

2.返回行集合


从数据库中返回行集合,并包含用于筛选结果的输入参数。 当我们执行返回行集合的存储过程时,会用到结果类,它存储从存储过程中返回的结果。


下面的示例表示一个存储过程,该存储过程返回客户行并使用输入参数来仅返回将“London”列为客户城市的那些行的固定几列。


ALTER PROCEDURE [dbo].[Customers By City]
-- Add the parameters for the stored procedure here
(@param1 NVARCHAR(20))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT CustomerID, ContactName, CompanyName, City from
Customers as c where c.City=@param1
END

拖到O/R设计器内,它自动生成了以下代码段:


[Function(Name="dbo.[Customers By City]")]
public ISingleResult Customers_By_City(
[Parameter(DbType="NVarChar(20)")] string param1)
{
IExecuteResult result = this.ExecuteMethodCall(this, (
(MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
return ((ISingleResult)
(result.ReturnValue));
}

我们用下面的代码调用:


ISingleResult result =
db.Customers_By_City("London");
foreach (Customers_By_CityResult cust in result)
{
Console.WriteLine("CustID={0}; City={1}", cust.CustomerID,
cust.City);
}

3.返回多个结果形状的映射


当存储过程可以返回多个结果形状时,返回类型无法强类型化为单个投影形状。尽管 LINQ to SQL 可以生成所有可能的投影类型,但它无法获知将以何种顺序返回它们。 ResultTypeAttribute 属性适用于返回多个结果类型的存储过程,用以指定该过程可以返回的类型的集合。


在下面的 SQL 代码示例中,结果形状取决于输入(param1 = 1或param1 = 2)。我们不知道先返回哪个投影。


ALTER PROCEDURE [dbo].[SingleRowset_MultiShape]
-- Add the parameters for the stored procedure here
(@param1 int )
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if(@param1 = 1)
SELECT * from Customers as c where c.Region = 'WA'
else if (@param1 = 2)
SELECT CustomerID, ContactName, CompanyName from
Customers as c where c.Region = 'WA'
END

拖到O/R设计器内,它自动生成了以下代码段:


[Function(Name="dbo.[Whole Or Partial Customers Set]")]
public ISingleResult
Whole_Or_Partial_Customers_Set([Parameter(DbType="Int")]
System.Nullable param1)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
return ((ISingleResult)
(result.ReturnValue));
}

但是,VS2008会把多结果集存储过程识别为单结果集的存储过程,默认生成的代码我们要手动修改一下,要求返回多个结果集,像这样:


[Function(Name="dbo.[Whole Or Partial Customers Set]")]
[ResultType(typeof(WholeCustomersSetResult))]
[ResultType(typeof(PartialCustomersSetResult))]
public IMultipleResults Whole_Or_Partial_Customers_Set([Parameter
(DbType="Int")] System.Nullable param1)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
return ((IMultipleResults)(result.ReturnValue));
}

我们分别定义了两个分部类,用于指定返回的类型。WholeCustomersSetResult类 如下:


public partial class WholeCustomersSetResult
{
private string _CustomerID;
private string _CompanyName;
private string _ContactName;
private string _ContactTitle;
private string _Address;
private string _City;
private string _Region;
private string _PostalCode;
private string _Country;
private string _Phone;
private string _Fax;
public WholeCustomersSetResult()
{
}
[Column(Storage = "_CustomerID", DbType = "NChar(5)")]
public string CustomerID
{
get{return this._CustomerID;}
set{
if ((this._CustomerID != value))
this._CustomerID = value;
}
}
[Column(Storage = "_CompanyName", DbType = "NVarChar(40)")]
public string CompanyName
{
get{return this._CompanyName;}
set{
if ((this._CompanyName != value))
this._CompanyName = value;
}
}
[Column(Storage = "_ContactName", DbType = "NVarChar(30)")]
public string ContactName
{
get{return this._ContactName;}
set{
if ((this._ContactName != value))
this._ContactName = value;
}
}
[Column(Storage = "_ContactTitle", DbType = "NVarChar(30)")]
public string ContactTitle
{
get{return this._ContactTitle;}
set{
if ((this._ContactTitle != value))
this._ContactTitle = value;
}
}
[Column(Storage = "_Address", DbType = "NVarChar(60)")]
public string Address
{
get{return this._Address;}
set{
if ((this._Address != value))
this._Address = value;
}
}
[Column(Storage = "_City", DbType = "NVarChar(15)")]
public string City
{
get{return this._City;}
set{
if ((this._City != value))
this._City = value;
}
}
[Column(Storage = "_Region", DbType = "NVarChar(15)")]
public string Region
{
get{return this._Region;}
set{
if ((this._Region != value))
this._Region = value;
}
}
[Column(Storage = "_PostalCode", DbType = "NVarChar(10)")]
public string PostalCode
{
get{return this._PostalCode;}
set{
if ((this._PostalCode != value))
this._PostalCode = value;
}
}
[Column(Storage = "_Country", DbType = "NVarChar(15)")]
public string Country
{
get{return this._Country;}
set{
if ((this._Country != value))
this._Country = value;
}
}
[Column(Storage = "_Phone", DbType = "NVarChar(24)")]
public string Phone
{
get{return this._Phone;}
set{
if ((this._Phone != value))
this._Phone = value;
}
}
[Column(Storage = "_Fax", DbType = "NVarChar(24)")]
public string Fax
{
get{return this._Fax;}
set{
if ((this._Fax != value))
this._Fax = value;
}
}
}
PartialCustomersSetResult类 如下:


代码在这里展开
public partial class PartialCustomersSetResult
{

private string _CustomerID;
private string _ContactName;
private string _CompanyName;
public PartialCustomersSetResult()
{
}
[Column(Storage = "_CustomerID", DbType = "NChar(5)")]
public string CustomerID
{
get{return this._CustomerID;}
set{
if ((this._CustomerID != value))
this._CustomerID = value;
}
}
[Column(Storage = "_ContactName", DbType = "NVarChar(30)")]
public string ContactName
{
get{return this._ContactName;}
set{
if ((this._ContactName != value))
this._ContactName = value;
}
}
[Column(Storage = "_CompanyName", DbType = "NVarChar(40)")]
public string CompanyName
{
get{return this._CompanyName;}
set{
if ((this._CompanyName != value))
this._CompanyName = value;
}
}
}
这样就可以使用了,下面代码直接调用,分别返回各自的结果集合。


//返回全部Customer结果集
IMultipleResults result = db.Whole_Or_Partial_Customers_Set(1);
IEnumerable shape1 =
result.GetResult();
foreach (WholeCustomersSetResult compName in shape1)
{
Console.WriteLine(compName.CompanyName);
}
//返回部分Customer结果集
result = db.Whole_Or_Partial_Customers_Set(2);
IEnumerable shape2 =
result.GetResult();
foreach (PartialCustomersSetResult con in shape2)
{
Console.WriteLine(con.ContactName);
}


4.返回顺序结果形状映射



这种存储过程可以生成多个结果形状,但我们已经知道结果的返回顺序。


下面是一个按顺序返回多个结果形状的存储过程Get Customer And Orders。 返回顾客ID为"SEVES"的顾客和他们所有的订单。


ALTER PROCEDURE [dbo].[Get Customer And Orders]
(@CustomerID nchar(5))
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT * FROM Customers AS c WHERE c.CustomerID = @CustomerID
SELECT * FROM Orders AS o WHERE o.CustomerID = @CustomerID
END
拖到设计器代码如下:


[Function(Name="dbo.[Get Customer And Orders]")]
public ISingleResult Get_Customer_And_Orders
([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)
(MethodInfo.GetCurrentMethod())), customerID);
return ((ISingleResult)
(result.ReturnValue));
}
同样,我们要修改自动生成的代码:


[Function(Name="dbo.[Get Customer And Orders]")]
[ResultType(typeof(CustomerResultSet))]
[ResultType(typeof(OrdersResultSet))]
public IMultipleResults Get_Customer_And_Orders([Parameter(Name="CustomerID",
DbType="NChar(5)")] string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)
(MethodInfo.GetCurrentMethod())), customerID);
return ((IMultipleResults)(result.ReturnValue));
}
同样,自己手写类,让其存储过程返回各自的结果集。


CustomerResultSet类


代码在这里展开
public partial class CustomerResultSet
{

private string _CustomerID;
private string _CompanyName;
private string _ContactName;
private string _ContactTitle;
private string _Address;
private string _City;
private string _Region;
private string _PostalCode;
private string _Country;
private string _Phone;
private string _Fax;
public CustomerResultSet()
{
}
[Column(Storage = "_CustomerID", DbType = "NChar(5)")]
public string CustomerID
{
get{return this._CustomerID;}
set{
if ((this._CustomerID != value))
this._CustomerID = value;
}
}
[Column(Storage = "_CompanyName", DbType = "NVarChar(40)")]
public string CompanyName
{
get{return this._CompanyName;}
set{
if ((this._CompanyName != value))
this._CompanyName = value;
}
}
[Column(Storage = "_ContactName", DbType = "NVarChar(30)")]
public string ContactName
{
get{return this._ContactName;}
set{
if ((this._ContactName != value))
this._ContactName = value;
}
}
[Column(Storage = "_ContactTitle", DbType = "NVarChar(30)")]
public string ContactTitle
{
get{return this._ContactTitle;}
set{
if ((this._ContactTitle != value))
this._ContactTitle = value;
}
}
[Column(Storage = "_Address", DbType = "NVarChar(60)")]
public string Address
{
get{return this._Address;}
set{
if ((this._Address != value))
this._Address = value;
}
}
[Column(Storage = "_City", DbType = "NVarChar(15)")]
public string City
{
get{return this._City;}
set{
if ((this._City != value))
this._City = value;
}
}
[Column(Storage = "_Region", DbType = "NVarChar(15)")]
public string Region
{
get{return this._Region;}
set{
if ((this._Region != value))
this._Region = value;
}
}
[Column(Storage = "_PostalCode", DbType = "NVarChar(10)")]
public string PostalCode
{
get{return this._PostalCode;}
set{
if ((this._PostalCode != value))
this._PostalCode = value;
}
}
[Column(Storage = "_Country", DbType = "NVarChar(15)")]
public string Country
{
get{return this._Country;}
set{
if ((this._Country != value))
this._Country = value;
}
}
[Column(Storage = "_Phone", DbType = "NVarChar(24)")]
public string Phone
{
get{return this._Phone;}
set{
if ((this._Phone != value))
this._Phone = value;
}
}

[Column(Storage = "_Fax", DbType = "NVarChar(24)")]
public string Fax
{
get{return this._Fax;}
set{
if ((this._Fax != value))
this._Fax = value;
}
}
}
OrdersResultSet类


代码在这里展开
public partial class OrdersResultSet
{
private System.Nullable _OrderID;
private string _CustomerID;
private System.Nullable _EmployeeID;
private System.Nullable _OrderDate;
private System.Nullable _RequiredDate;
private System.Nullable _ShippedDate;
private System.Nullable _ShipVia;
private System.Nullable _Freight;
private string _ShipName;
private string _ShipAddress;
private string _ShipCity;
private string _ShipRegion;
private string _ShipPostalCode;
private string _ShipCountry;
public OrdersResultSet()
{
}
[Column(Storage = "_OrderID", DbType = "Int")]
public System.Nullable OrderID
{
get{return this._OrderID;}
set{
if ((this._OrderID != value))
this._OrderID = value;
}
}
[Column(Storage = "_CustomerID", DbType = "NChar(5)")]
public string CustomerID
{
get{return this._CustomerID;}
set{
if ((this._CustomerID != value))
this._CustomerID = value;
}
}
[Column(Storage = "_EmployeeID", DbType = "Int")]
public System.Nullable EmployeeID
{
get{return this._EmployeeID;}
set{
if ((this._EmployeeID != value))
this._EmployeeID = value;
}
}
[Column(Storage = "_OrderDate", DbType = "DateTime")]
public System.Nullable OrderDate
{
get{return this._OrderDate;}
set{
if ((this._OrderDate != value))
this._OrderDate = value;
}
}
[Column(Storage = "_RequiredDate", DbType = "DateTime")]
public System.Nullable RequiredDate
{
get{return this._RequiredDate;}
set{
if ((this._RequiredDate != value))
this._RequiredDate = value;
}
}
[Column(Storage = "_ShippedDate", DbType = "DateTime")]
public System.Nullable ShippedDate
{
get{return this._ShippedDate;}
set{
if ((this._ShippedDate != value))
this._ShippedDate = value;
}
}
[Column(Storage = "_ShipVia", DbType = "Int")]
public System.Nullable ShipVia
{
get{return this._ShipVia;}
set{
if ((this._ShipVia != value))
this._ShipVia = value;
}
}
[Column(Storage = "_Freight", DbType = "Money")]
public System.Nullable Freight
{
get{return this._Freight;}
set{
if ((this._Freight != value))
this._Freight = value;
}
}
[Column(Storage = "_ShipName", DbType = "NVarChar(40)")]
public string ShipName
{
get{return this._ShipName;}
set{
if ((this._ShipName != value))
this._ShipName = value;
}
}
[Column(Storage = "_ShipAddress", DbType = "NVarChar(60)")]
public string ShipAddress
{
get{return this._ShipAddress;}
set{
if ((this._ShipAddress != value))
this._ShipAddress = value;
}
}
[Column(Storage = "_ShipCity", DbType = "NVarChar(15)")]
public string ShipCity
{
get{return this._ShipCity;}
set{
if ((this._ShipCity != value))
this._ShipCity = value;
}
}
[Column(Storage = "_ShipRegion", DbType = "NVarChar(15)")]
public string ShipRegion
{
get{return this._ShipRegion;}
set{
if ((this._ShipRegion != value))
this._ShipRegion = value;
}
}
[Column(Storage = "_ShipPostalCode", DbType = "NVarChar(10)")]
public string ShipPostalCode
{
get{return this._ShipPostalCode;}
set{
if ((this._ShipPostalCode != value))
this._ShipPostalCode = value;
}
}

[Column(Storage = "_ShipCountry", DbType = "NVarChar(15)")]
public string ShipCountry
{
get{return this._ShipCountry;}
set{
if ((this._ShipCountry != value))
this._ShipCountry = value;
}
}
}
这时,只要调用就可以了。


IMultipleResults result = db.Get_Customer_And_Orders("SEVES");
//返回Customer结果集
IEnumerable customer =
result.GetResult();
//返回Orders结果集
IEnumerable orders =
result.GetResult();
//在这里,我们读取CustomerResultSet中的数据
foreach (CustomerResultSet cust in customer)
{
Console.WriteLine(cust.CustomerID);
}


5.带输出参数


LINQ to SQL 将输出参数映射到引用参数,并且对于值类型,它将参数声明为可以为 null。


下面的示例带有单个输入参数(客户 ID)并返回一个输出参数(该客户的总销售额)。


ALTER PROCEDURE [dbo].[CustOrderTotal]
@CustomerID nchar(5),
@TotalSales money OUTPUT
AS
SELECT @TotalSales = SUM(OD.UNITPRICE*(1-OD.DISCOUNT) * OD.QUANTITY)
FROM ORDERS O, "ORDER DETAILS" OD
where O.CUSTOMERID = @CustomerID AND O.ORDERID = OD.ORDERID

把这个存储过程拖到设计器中,图片如下:



其生成代码如下:


[Function(Name="dbo.CustOrderTotal")]
public int CustOrderTotal([Parameter(Name="CustomerID", DbType="NChar(5)")]
string customerID,[Parameter(Name="TotalSales", DbType="Money")]
ref System.Nullable totalSales)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)
(MethodInfo.GetCurrentMethod())), customerID, totalSales);
totalSales = ((System.Nullable)(result.GetParameterValue(1)));
return ((int)(result.ReturnValue));
}

我们使用下面的语句调用此存储过程:


decimal? totalSales = 0;
string customerID = "ALFKI";
db.CustOrderTotal(customerID, ref totalSales);
Console.WriteLine("Total Sales for Customer '{0}' = {1:C}",
customerID, totalSales);

好了,就说到这里了,其增删改操作同理。相信大家通过这5个实例理解了存储过程。




作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.