04Linqtosql--存储过程
- 格式:doc
- 大小:273.00 KB
- 文档页数:10
使用LINQ进行多表操作(一)有时候我们需要对多张数据表进行一次性的Select操作。
目前就我所知的操作方法有三种:1.直接写表达式;2.使用LoadOption选项;3.使用Join语句。
那么,这三种语句用哪一种好呢?让我们来做一个小小的研究。
呱呱。
1:1关系的多表操作表结构如下首先是测试取全记录的情况(也就是取所有字段)直接写表达式var user = ers.Where(p => erID == 10300).Select(p => new{p , erData});SELECT[t0].[UserID], [t0].[Email], [t0].[NickName], [t2].[test], [t2].[UserID ]AS[UserID2], [t2].[MyInfo], [t2].[MyFriends]FROM[dbo].[Users]AS[t0] LEFT OUTER JOIN(SELECT1AS[test], [t1].[UserID], [t1].[MyInfo], [t1]. [MyFriends]FROM[dbo].[UserData]AS[t1]) AS[t2]ON[t2].[UserID]=[t0 ].[UserID]WHERE[t0].[UserID]=10300使用LoadOption选项var option = new DataLoadOptions();option.LoadWith<User>(p => erData);context.LoadOptions = option;var user = ers.Where(p => erID == 10300).Single();var userdata = erData;虽然看上去取了2次数据,但是因为指定了LoadOption选项,所以也是一次性从数据库取出来的。
SELECT[t0].[UserID], [t0].[Email], [t0].[NickName], [t2].[test], [t2].[UserID ]AS[UserID2], [t2].[MyInfo], [t2].[MyFriends]FROM[dbo].[Users]AS[t0]LEFT OUTER JOIN(SELECT1AS[test], [t1].[UserID], [t1].[MyInfo], [t1].[M yFriends]FROM[dbo].[UserData]AS[t1]) AS[t2]ON[t2].[UserID]=[t0]. [UserID]WHERE[t0].[UserID]=10300使用Join语句var user = ers.Where(p => erID == 10300).Join(erData s, p => erID, o => erID, (o, p) => new{ o, p });SELECT[t0].[UserID], [t0].[Email], [t0].[NickName], [t1].[UserID]AS[UserID 2], [t1].[MyInfo], [t1].[MyFriends]FROM[dbo].[Users]AS[t0]INNER JOIN [dbo].[UserData]AS[t1]ON[t0].[UserID]=[t1].[UserID]WHERE[t0].[UserI D]=10300但是要注意的一点是,如果用了.Select(p => new {p, erData}) 这种代码,你在使用实体的时候会稍微麻烦一点,要采用erID这种形式,非常不爽。
SQLite是一种轻量级的数据库管理系统,它可以在各种操作系统上运行,并且可以在嵌入式设备和大型企业服务器上使用。
SQLite的存储过程功能使得用户可以将一系列的SQL语句保存和执行,这为用户提供了更加灵活和高效的数据操作方式。
1. 存储过程的定义SQLite的存储过程是一组为了完成特定任务而保存在数据库中的SQL 语句集合。
存储过程可以接受参数,进行计算,生成结果集等。
存储过程的主要作用是为了提高数据库操作的效率和安全性,并且可以减少客户端和服务器之间的通信次数。
2. 存储过程的语法SQLite的存储过程使用CREATE PROCEDURE语句进行定义,语法格式如下:```sqlCREATE PROCEDURE procedure_name (parameter1, parameter2, ...)ASsql_statement;```其中,procedure_name为存储过程的名称,parameter1, parameter2为存储过程的参数,sql_statement为存储过程的SQL 语句。
3. 存储过程的参数SQLite的存储过程可以接受零个或多个参数,参数可以是输入参数、输出参数或者输入输出参数。
存储过程的参数在定义时需要指定参数的名称和数据类型,以及参数的模式(输入、输出或输入输出)。
```sqlCREATE PROCEDURE procedure_name (IN parameter1data_type, OUT parameter2 data_type, INOUT parameter3 data_type)ASsql_statement;```4. 存储过程的实例下面我们用一个实例来演示SQLite存储过程的写法。
假设我们需要创建一个存储过程,通过传入两个参数计算它们的和并返回结果。
```sqlCREATE PROCEDURE add_two_numbers (IN num1 INTEGER, IN num2 INTEGER, OUT result INTEGER)ASBEGINSET result = num1 + num2;END;```在上面的例子中,我们定义了一个名为add_two_numbers的存储过程,它接受两个输入参数num1和num2,并返回一个输出参数result。
SQL存储过程详细介绍及语法------------恢复内容开始------------声明:存储过程并不推荐在开发中使⽤,某⾥巴巴制定的开发宝典中明令禁⽌使⽤存储过程。
那为什么还要学?被逼⽆奈,维护旧版系统不想全部推翻重来,只有硬着头⽪要弄懂,才改的动。
创建存储过程 SQL Server创建存储过程: create procedure 过程名 @parameter 参数类型 @paramater 参数类型 as begin end执⾏存储过程 execute 过程名实例1.不带参数的存储过程create procedure proc_sql1asbegindelclare @i intset @i = 26while @i <1beginprint char(ascii('a') + @i) + '的ASCII码是:' + cast(ascii('a') + @i as varchar(5))set @i = @i +1endendexec proc_sql1输出结果:1 a的ASCII码是: 972 b的ASCII码是: 983 c的ASCII码是: 99~~~~~26 z的ASCII码是:1222.数据查询功能不带参数的存储过程create procedure proc_sql2asbeginselect * from employee where salary > 2000endexecute proc_sql2在存储过程中可以包含多个select语句,显⽰姓名中含有“张”字的职⼯信息及其所在的仓库信息create procedure pro_sql3asbeginselect * from employee where name like '%张%'select * from warehouse where warehouseNo in (select warehouse from employee where name like '%张%')goexecute pro_sql33.带有输⼊参数的存储过程 找出三个数字中最⼤的数create proc proc_sql4@num1 int,@num2 int,@num3 intasbegin declare @max int if @num1>@num2 set @max = @num1 else set @max = @num2 if @num3 > @max set @max = @num3 print '3个数的中最⼤的数字是:' + cast (@max as varchar (20) )endexecute proc_sql4 3 , 4 ,54.求阶乘之和alter proc proc_sql5@dataSource intasbegindeclare @sum int ,@temp int, @tempSum intset @sum = 0set @temp = 1set @tempSum = 1while @temp <= @dataSourcebeginset @tempSum = @tempSum * @tempset @sum = @sum + @tempSumset @temp = @temp +1endprint cast ( @dataSource as varchar(50) ) + '的阶乘之和为:' + cast (@sum as varchar(50)) endexecute proc_sql5 55.带有输⼊参数的数据查询功能的存储过程create proc proc_sql6@minSalary int,@maxSalary intasbeginselect * from empolyee where salary > @minSalary and salary< @maxSalaryendexecute proc_sql6 8000,100006. 带有条件判断的插⼊功能的存储过程create proc proc_sql7@id varchar(30),@deptNo varchar(30),@name varchaer(50),@sex varchar(10),@salary int(10)asbeginif Exists (select * from employee where id = @id)print ‘该员⼯号已经存在,请输⼊正确的id’elsebeginif(Exists (select * from dept where de))7.储存过程的⾃动执⾏ 使⽤sp_procoption系统存储过程即可⾃动执⾏⼀个或者多个存储过程,其语法格式如下: sp_procoption [@procName=] 'procedure', [@optionName=] 'option', [@optionValue=] 'value'各个参数含义如下:[@procName=] 'procedure':即⾃动执⾏的存储过程[@optionName=] 'option':其值是startup,即⾃动执⾏存储过程[@optionValue=] 'value':表⽰⾃动执⾏是开(true)或是关(false)sp_procoption @procName='masterproc', @optionName='startup', @optionValue='true' 利⽤sp_procoption系统函数设置存储过程masterproc为⾃动执⾏8. 监控存储过程可以使⽤sp_monitor可以查看SQL Server服务器的各项运⾏参数,其语法格式如下:sp_monitor该存储过程的返回值是布尔值,如果是0,表⽰成功,如果是1,表⽰失败。
SQL入门级教程之存储过程今天继续我们的SQL菜鸟教程,上篇博客说了说触发器(SQL菜鸟入门级教程之触发器),今天我们来说说存储过程。
其实,触发器也属于存储过程,只不过它比较特殊。
下面切入正题,让我带领众菜鸟们一起学习一下存储过程。
存储过程简介存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在数据库系统中,存储过程和触发器具有很重要的作用。
无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。
存储过程的分类1系统存储过程以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
2本地存储过程用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,这跟各种编程语言里用户自己写的函数非常类似。
我们一般所说的存储过程就是指本地存储过程。
今天我们重点介绍本地存储过程,其他存储过程了解即可。
3临时存储过程分为两种存储过程:一是本地临时存储过程,以“#”开头,这样的存储过程就是存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;二是全局临时存储过程,以“##”开头,这样的存储过程就是存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
4远程存储过程在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5扩展存储过程扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。
创建存储过程的基本代码结构:优点1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
SQL存储过程简介SQL存储过程是一种预编译的数据库操作,它被存储在数据库服务器中,并可以由应用程序调用。
存储过程可以包含SQL语句、控制流程和业务逻辑,它们提供了一种更高效、更安全的处理方法。
本文将介绍SQL存储过程的基本语法和用法,并提供一些示例来帮助您更好地理解。
存储过程语法SQL存储过程使用CREATE PROCEDURE语句来创建。
下面是一般存储过程的语法:CREATE PROCEDURE procedure_name[parameter1 data_type, [parameter2 data_type, ...]][OUT return_value data_type]BEGIN-- 存储过程主体,包括SQL语句、控制流程和业务逻辑END;•procedure_name是存储过程的名称,可以自定义。
•parameter1, parameter2, ...是可选参数列表,用于传递数据给存储过程。
参数包括参数名称和数据类型。
•OUT return_value是可选的输出参数,用于返回存储过程的结果。
存储过程示例下面是一个简单的示例,展示了如何创建一个存储过程。
该存储过程接受一个参数,并返回对应参数的平方值:CREATE PROCEDURE calculate_square@input INT,@output INT OUTBEGINSET @output = @input * @input;END;在上面的示例中,calculate_square是存储过程的名称,@input是输入参数,@output是输出参数。
调用存储过程一旦创建了存储过程,可以使用EXECUTE或EXEC语句来调用它。
下面是一个调用存储过程的示例:DECLARE @result INT;EXEC calculate_square 5, @result OUT;SELECT @result;在上面的示例中,@result是一个变量,用于接收存储过程的输出结果。
sql存储过程详解SQL存储过程是指一段预先编写好的SQL代码,可以被多次调用,用于执行特定的任务或操作。
存储过程通常由一系列SQL语句、变量、分支结构和循环结构组成。
在数据库中,存储过程可以提高数据处理效率、简化复杂的业务逻辑和保证数据安全性。
本文将详细介绍SQL 存储过程的定义、创建、调用和优化等方面。
一、定义SQL存储过程是指一段预先编写好的SQL代码,可以被多次调用,用于执行特定的任务或操作。
存储过程通常由一系列SQL语句、变量、分支结构和循环结构组成。
在数据库中,存储过程可以提高数据处理效率、简化复杂的业务逻辑和保证数据安全性。
二、创建在创建一个存储过程之前,需要确保已经连接到了正确的数据库,并且有足够的权限来创建一个新的存储过程。
下面是一个简单的创建存储过程的示例:CREATE PROCEDURE sp_exampleASBEGIN-- SQL code goes hereEND其中,“sp_example”是存储过程名称,“AS”关键字表示开始定义该存储过程,“BEGIN”和“END”之间是该存储过程所包含的所有代码。
三、调用当需要使用某个存储过程时,可以使用以下语法来调用该存储过程:EXEC sp_example其中,“sp_example”是需要调用的存储过程名称,“EXEC”关键字表示执行该存储过程。
四、优化为了提高SQL存储过程的性能和效率,可以采取以下一些优化措施:1. 尽量避免使用“SELECT *”语句,因为这会导致查询所有列,而不仅仅是需要的列。
2. 尽量避免使用“CURSOR”游标,因为这会导致性能下降。
3. 尽量避免在存储过程中使用大量的循环结构和条件判断语句,因为这会导致代码复杂度增加,从而影响性能。
4. 尽量避免在存储过程中使用大量的临时表或变量,因为这会导致内存占用增加,从而影响性能。
5. 使用参数化查询可以提高查询效率和安全性。
参数化查询是指将SQL查询语句中的变量替换成占位符,在执行时再将具体值传入占位符中。
oracle sql查询存储过程内容Oracle SQL查询存储过程内容在Oracle数据库中,存储过程是一种预编译的数据库对象,用于封装一系列的SQL语句和业务逻辑。
当我们需要查询存储过程的内容时,可以通过以下方式实现:1. 使用Oracle SQL开发工具Oracle SQL开发工具如SQL Developer、Toad等,提供了直接查询数据库对象的功能。
通过连接到相应的数据库,我们可以执行以下步骤:•打开SQL开发工具并连接到数据库。
•在数据库导航栏中选择存储过程所在的模式(Schema)。
•展开“存储过程”(或类似的选项)文件夹,找到目标存储过程。
•右键单击存储过程,并选择“查看”选项。
•在弹出的窗口中,可以查看到存储过程的代码或源码。
2. 使用SQL查询系统表Oracle数据库提供了一些系统表,存储了数据库对象的元数据信息。
我们可以通过查询这些系统表来获取存储过程的内容。
以下是一些常用的系统表和他们的用途:•ALL_OBJECTS:包含了数据库中所有的对象信息,包括存储过程。
•ALL_SOURCE:存储了数据库中所有对象的源码信息,包括存储过程的代码。
•ALL_PROCEDURES:记录了所有存储过程的详细信息,包括存储过程名称、所属模式等。
通过执行类似以下的SQL查询语句,我们可以获取存储过程的内容:SELECT textFROM all_sourceWHERE object_type = 'PROCEDURE'AND owner = 'SCHEMA_NAME'AND name = 'PROCEDURE_NAME';请注意将上述查询语句中的’SCHEMA_NAME’和’PROCEDURE_NAME’替换为实际的模式名称和存储过程名称。
3. 使用DBMS_METADATA包Oracle数据库提供了一个名为DBMS_METADATA的强大的包,它可以用于获取数据库对象的元数据信息。
sqlite 存储过程的写法一、前言SQLite是一个轻量级的数据库,广泛应用于嵌入式和移动应用中。
它支持存储过程,允许开发者在数据库中创建可重用的代码片段,以执行复杂的查询、验证和数据转换。
本教程将介绍SQLite中存储过程的编写和使用。
二、创建存储过程存储过程是在数据库中预先编译和存储的SQL语句集。
当需要执行相同的操作时,使用存储过程可以提高性能并减少网络通信开销。
1. 创建存储过程的语法```sqlCREATE PROCEDURE procedure_name[parameter_list][BEGINSQL statementsEND]```其中,`parameter_list`是参数列表,可以包含输入参数(IN)和输出参数(OUT)。
如果没有指定参数,则视为无参数。
2. 示例:创建一个简单的存储过程假设我们有一个名为"users"的表,包含"id"、"name"和"age"列。
我们希望创建一个存储过程,用于插入新用户数据并返回其ID。
```sqlCREATE PROCEDURE insert_user(name TEXT, age INT)BEGININSERT INTO users(name, age) VALUES(name, age);SELECT last_insert_rowid() AS new_id;END;```三、调用存储过程创建好存储过程后,可以通过调用它来执行其中的SQL语句。
以下是调用存储过程的示例:1. 调用存储过程的语法调用存储过程的语法如下:```sqlCALL procedure_name(parameter1, parameter2, ...);```2. 示例:调用存储过程插入新用户并获取ID假设我们调用上面创建的"insert_user"存储过程,并传入一个名为"John Doe"、年龄为25的用户数据:```sqlCALL insert_user('John Doe', 25);```四、注意事项和最佳实践1. 确保存储过程逻辑正确,并进行充分的测试。
sql中存储过程的用法一、概述存储过程是一种保存在数据库中的程序,可以执行一系列操作,包括数据查询、数据更新、事务控制和多个SQL语句的执行,等等。
存储过程可以简化许多重复的工作,提高数据库的性能,增加数据的安全性和保密性。
二、创建存储过程在SQL Server中,创建存储过程可以使用CREATE PROCEDURE语句。
例如:```CREATE PROCEDURE [dbo].[proc_SelectUsers]ASBEGINSELECT * FROM UsersEND```上述语句创建了一个名为proc_SelectUsers的存储过程,它会查询Users表中所有的数据。
注意,存储过程创建语句的标准格式如下:```CREATE [OR ALTER] PROCEDURE procedure_name [parameter_list][WITH <procedure_option> [,...n]]ASsql_statement [;] [,...n]```参数列表(parameter_list)是可选的,用于指定存储过程所需的参数。
WITH子句是可选的,用于指定存储过程的一些选项,如ENCRYPTION、EXECUTE AS和RECOMPILE等。
sql_statement则是存储过程要执行的一系列SQL语句。
三、执行存储过程在SQL Server中,可以使用EXECUTE语句或者EXEC语句(两者等效)来执行存储过程。
例如:```EXEC proc_SelectUsers```以上语句将会执行名为proc_SelectUsers的存储过程,返回查询结果。
如果存储过程有参数,则执行语句应该像这样:```EXEC proc_SelectUsersByGender @Gender = 'F'```上述语句将会执行名为proc_SelectUsersByGender的存储过程,传递Gender参数值为“F”,返回查询结果。
SQL存储过程、视图存储过程:存储过程(stored procedure)有时也称为sproc。
存储过程存储于数据库中⽽不是在单独的⽂件中,有输⼊参数、输出参数以及返回值等。
在数据库中,创建存储过程和创建其他对象的过程⼀样,除了它使⽤的AS关键字外。
存储过程的基本语法如下:CREATE PROCDUER|PROC <sproc name>[<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,[<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,...]][WITHRECOMPILE|ENCRYPTION|[EXECUTE AS {CALLER|SELF|OWNER|<'user name'>}][FOR REPLICATION]AS<code>|EXTERNAL NAME <assembly name>.<assembly class>存储过程⽰例⼀:执⾏存储过程⽅法⼀:执⾏存储过程⽅法⼆:上⾯说过,存储过程可以定义返回值。
⽰例:修改存储过程⽰例:利⽤存储过程查找三个表内的信息⽰例:⽰例:⽰例⼆:练习:超市管理系统:表⼀:门店仓库表 MenDian列名:商品编号scode、商品名称sname、商品数量sshu、商品单价sprice、商品进货商sgong表⼆:进货商的表 Gongying列名:进货商的编号gcode、进货商名称gname,进货商联系⼈glian、进货商的电话gtel表三:⼩票表 Xiaopiao列名:⼩票编号pcode、商品名称pname、商品单价pprice、数量pshu、总价pzong、时间ptime要求,写⼀个存储过程,买东西,⾃动添加⼩票进⼊。
04 Linq to sql—存储过程知识点普通存储过程首先在查询分析器运行下面的代码来创建一个存储过程:create proc sp_singleresultsetasset nocount onselect*from customers然后打开IDE的服务器资源管理器,之前我们从表中拖动表到dbml设计视图,这次我们从存储过程中找到刚才创建的存储过程,然后拖动到设计视图。
在方法面板中可以看到已经创建了一个sp_singleresultset的方法,如下图:然后打开Northwind.designer.cs,可以找到下面的代码:[Function(Name="dbo.sp_singleresultset")]public ISingleResult<sp_singleresultsetResult> sp_singleresultset(){IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));return ((ISingleResult<sp_singleresultsetResult>)(result.ReturnValue));}我们可以发现,IDE为这个存储过程单独生成了返回结果集的实体定义,你可能会觉得很奇怪,IDE怎么知道这个存储过程将会返回哪些数据那?其实,在把存储过程拖拽入dbml设计视图的时候,IDE就执行了类似下面的命令:SET FMTONLY ON;exec Northwind.dbo.sp_singleresultsetSET FMTONLY OFF;这样就可以直接获取存储过程返回的元数据而无须执行存储过程。
其实我们存储过程返回的就是顾客表的数据,如果你觉得为存储过程单独设置结果集实体有些浪费的话可以在存储过程的属性窗口中调整返回类型从“自动生成的类型”到Customer,不过以后你只能通过删除方法面板中的存储过程,然后重新添加来还原到“自动生成的类型”。
下面,我们可以写如下的Linq to object代码进行查询:var单结果集存储过程=from c in ctx.sp_singleresultset()where c.CustomerID.StartsWith("A")select c;在这里确实是Linq to object的,因为查询句法不会被整句翻译成SQL,而是从存储过程的返回对象中再去对对象进行查询。
SQL代码如下:EXEC @RETURN_VALUE = [dbo].[sp_singleresultset]-- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) []带参数的存储过程创建如下存储过程:create proc [dbo].[sp_withparameter]@customerid nchar(5),@rowcount int outputasset nocount onset @rowcount =(select count(*)from customers where customerid = @customerid)使用同样的方法生成存储过程方法,然后使用下面的代码进行测试:int? rowcount = -1;ctx.sp_withparameter("", ref rowcount);Response.Write(rowcount);ctx.sp_withparameter("ALFKI", ref rowcount);Response.Write(rowcount);结果输出了“01”。
说明ID为“”的顾客数为0,而ID为“ALFKI”的顾客数为1。
存储过程的输出参数被封装成了ref 参数,对于C#语法来说非常合情合理。
SQL代码如下:EXEC @RETURN_VALUE = [dbo].[sp_withparameter] @customerid = @p0, @rowcount = @p1 OUTPUT-- @p0: Input StringFixedLength (Size = 5; Prec = 0; Scale = 0) []-- @p1: InputOutput Int32 (Size = 0; Prec = 0; Scale = 0) [-1]-- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) []带返回值的存储过程再来创建第三个存储过程:create proc [dbo].[sp_withreturnvalue]@customerid nchar(5)asset nocount onif exists(select 1 from customers where customerid = @customerid)return 101elsereturn 100生成方法后,可以通过下面的代码进行测试:Response.Write(ctx.sp_withreturnvalue(""));Response.Write(ctx.sp_withreturnvalue("ALFKI"));运行后程序输出“100101”多结果集的存储过程(每次改动Linq的配置,需要对多结果重新设置,方法是第一次改好以后,用记事本存储起来,一旦有改动,在拷贝过去替换)再来创建一个多结果集的存储过程:Create proc [dbo].[sp_multiresultset]asset nocount onselect*from customersselect*from employees找到生成的存储过程方法:[Function(Name="dbo.sp_multiresultset")]public ISingleResult<sp_multiresultsetResult> sp_multiresultset(){IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));return ((ISingleResult<sp_multiresultsetResult>)(result.ReturnValue));}由于现在的VS2010会把多结果集存储过程识别为单结果集存储过程(只认识第一个结果集),我们只能对存储过程方法多小动手术,修改为:[Function(Name="dbo.sp_multiresultset")][ResultType(typeof(Customer))][ResultType(typeof(Employee))]public IMultipleResults sp_multiresultset(){IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return (IMultipleResults)(result.ReturnValue);}然后使用下面的代码测试:var多结果集存储过程= ctx.sp_multiresultset();var Customers = 多结果集存储过程.GetResult<Customer>();var Employees = 多结果集存储过程.GetResult<Employee>();GridView1.DataSource = from emp in Employees where emp.FirstName.Contains("A") select emp;GridView1.DataBind();GridView2.DataSource = from c in Customers where c.CustomerID.StartsWith("A") select c;GridView2.DataBind();使用存储过程新增数据存储过程除了可以直接调用之外,还可以用于实体的增删改操作。
还记得在《增删改》中创建的留言簿程序吗?下面我们就来改造这个程序,使用存储过程而不是系统生成的SQL实现实体增删改。
首先,我们创建下面的存储过程Create proc sendmessage@username varchar(50),@message varchar(500)asinsert into tbguestbook(id,username,posttime,[message],isreplied,reply)values(newid(),@username,getdate(),@message,0,'')然后,打开留言簿dbml,把存储过程从服务器资源管理器拖拽到设计视图上。
右键点击tbGuestBook实体类,选择配置行为。
如下图,为插入操作选择刚才创建的存储过程方法,并进行参数匹配:由于我们的存储过程只接受2个参数,相应修改以下创建留言的按钮处理事件:Protected void btn_SendMessage_Click(object sender, EventArgs e){tbGuestBook gb = new tbGuestBook();erName = tb_UserName.Text;gb.Message = tb_Message.Text;ctx.tbGuestBooks.InsertOnSubmit (gb);ctx.SubmitChanges();SetBind();}运行程序后可以发现,在提交修改的时候调用了下面的SQL:EXEC @RETURN_VALUE = [dbo].[sendmessage] @username = @p0, @message = @p1-- @p0: Input AnsiString (Size = 5; Prec = 0; Scale = 0) [zhuye]-- @p1: Input AnsiString (Size = 11; Prec = 0; Scale = 0) [new message]-- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) []使用存储过程删除数据创建如下存储过程:Create proc delmessage@id uniqueidentifierasdelete tbguestbook where id=@id按照前面的步骤生成存储过程方法,并为删除操作执行这个存储过程方法。