Linq to SQL之使用存储过程 (1)
2007-07-10 15:28
585 查看
本文以Northwind数据库为例,说说Linq to SQL中是怎样使用存储过程。
首先我们创建一个存储过程:
打开dbml设计器,在Server Explorer里面找个这个存储过程,把它拖拽到设计器里面,可以看到这个存储过程被映射为方法了
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
这里有一点值得注意,(以存储过程linqDemo1为例)默认情况下,设计器对存储过程进行分析,将所有输出构造成一个结果类,运行该存储过程返回的就是这个类的对象集合。看看linqDemo1自动生成的代码:
LinqDemo1Result类就是生成的结果类,由于返回的customer表,该类的所有属性其实和customer的一模一样。 所以刚才拖拽存储过程的时候,如果把它拖拽到Customer类图的上面而不是周围的空白区域,生成的代码如下:
可以看到,它将存储过程返回的结果用Customer对象的集合来表示,而非创建一个自定义的结果类。
那么怎样运行存储过程呢?就和调用普通的成员方法一样,Linq to SQL将它映射到数据库中的存储过程:
是不是很简单?下面再来看看怎样调用带参数的存储过程
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
然后利用设计器自动映射该存储过程,带参数的存储过程也就相应的映射为带参数的成员函数,怎样调用就不多说了。
如果我们使用带output参数的存储过程呢?
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
生成的成员函数是下面这样:
可以看到它使用一个ref参数来保存返回参数的值,如下调用:
首先我们创建一个存储过程:
create procedure dbo.linqDemo1 as select * from customers
打开dbml设计器,在Server Explorer里面找个这个存储过程,把它拖拽到设计器里面,可以看到这个存储过程被映射为方法了
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
这里有一点值得注意,(以存储过程linqDemo1为例)默认情况下,设计器对存储过程进行分析,将所有输出构造成一个结果类,运行该存储过程返回的就是这个类的对象集合。看看linqDemo1自动生成的代码:
[Function(Name="dbo.linqDemo1")] public ISingleResult<linqDemo1Result> linqDemo1() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((ISingleResult<linqDemo1Result>)(result.ReturnValue)); }
LinqDemo1Result类就是生成的结果类,由于返回的customer表,该类的所有属性其实和customer的一模一样。 所以刚才拖拽存储过程的时候,如果把它拖拽到Customer类图的上面而不是周围的空白区域,生成的代码如下:
[Function(Name="dbo.linqDemo1")] public ISingleResult<Customer> linqDemo1() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((ISingleResult<Customer>)(result.ReturnValue)); }
可以看到,它将存储过程返回的结果用Customer对象的集合来表示,而非创建一个自定义的结果类。
那么怎样运行存储过程呢?就和调用普通的成员方法一样,Linq to SQL将它映射到数据库中的存储过程:
NorthwindDataContext ctx = new NorthwindDataContext(); var results = ctx.linqDemo1();
是不是很简单?下面再来看看怎样调用带参数的存储过程
create procedure dbo.linqDemo2 @cID varchar(5) as select * from customers where customerID = @cID
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
然后利用设计器自动映射该存储过程,带参数的存储过程也就相应的映射为带参数的成员函数,怎样调用就不多说了。
[Function(Name="dbo.linqDemo2")] public ISingleResult<Customer> linqDemo2([Parameter(DbType="VarChar(5)")] string cID) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), cID); return ((ISingleResult<Customer>)(result.ReturnValue)); }
如果我们使用带output参数的存储过程呢?
create procedure dbo.linqDemo3 @cID varchar(5), @msgCode int output as select * from customers where customerID = @cID set @msgCode = 50
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
生成的成员函数是下面这样:
[Function(Name="dbo.linqDemo3")] public ISingleResult<Customer> linqDemo3([Parameter(DbType="VarChar(5)")] string cID, [Parameter(DbType="Int")] ref System.Nullable<int> msgCode) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), cID, msgCode); msgCode = ((System.Nullable<int>)(result.GetParameterValue(1))); return ((ISingleResult<Customer>)(result.ReturnValue)); }
可以看到它使用一个ref参数来保存返回参数的值,如下调用:
NorthwindDataContext ctx = new NorthwindDataContext(); int? output = 0; var results = ctx.linqDemo3("ALFKI", ref output);
相关文章推荐
- LINQ to SQL 查询数据库和使用存储过程
- LINQ to SQL 查询数据库和使用存储过程
- 地磅称量系统之(17~23)使用LINQ to SQL Classes模板将数据表和存储过程映射成对象
- LINQ to SQL 查询数据库和使用存储过程
- Linq to sql:使用存储过程新增数据
- [代码]如何使用存储过程返回行集(LINQ to SQL)
- [代码]如何使用带参数的存储过程(LINQ to SQL)
- Linq to SQL之使用存储过程 (2)
- Linq to sql:使用存储过程删除数据
- LINQ to SQL 查询数据库和使用存储过程
- Linq To Sql常用方法使用总结
- Linq to DataSet 能否和 Linq to SQL 混合使用?
- 如何在 ASP.NET项目里面正确使用Linq to Sql(转)
- Linq to SQL 也来AOP 之 —— ALinq Inject 使用指南
- 关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题
- Visual Entity 使用教程(做最好用的实体代码生成器 支持 NHibernate 和 Linq to SQL)
- Linq To Sql常用方法使用总结
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- [转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
- Linq to sql(五):存储过程(一)