浅谈存储过程
来源:互联网 发布:linux 桌面环境 编辑:程序博客网 时间:2024/05/16 23:37
作者信息
【1】什么是过程?过程与函数的区别?什么是存储过程???
函数是带返回值的过程过程是没有返回值的函数
存储过程:存储在数据库中的封装了若干条SQL语句的过程(MySql不支持不存储的匿名过程)
【2】存储过程的创建语法
MySQL:create procedure procedureName() begin -- 存储过程的编程 -- SQL statements end;SQLServer:create procedure procedurename @参数1名 类型 , @参数2 类型asbegin -- 存储过程的编程 -- SQL statements end
查看所有的procedure : show procedure status;
可给存储过程传递参数
MySQL:create procedure procedureName([in/out/inout] 参数名 参数类型.....) 其中的in/out/inout 是可选的,也就是说可有可无 in 默认缺省是in类型,为了函数内部使用的,调用时传值 call proName(参数值) out 外输出参数,函数处理后,外部可调用(select @参数名)调用:call proName(@参数名)SQLServer 无括号
inout 兼顾二者的特点
注意
:函数调用时,
in类型给传值,call proName(参数值)
out类型给传变量名(函数内部手动初始化)call proName(@参数名)
inout类型 需要传一个已经定义了的变量
set @变量名:=变量初始值;
call proName(@变量名)
如:
MySQL: create procedure p1(width int,height int) begin select concat('area is',width*height ) as area; if width>height then select 'you fat'; elseif width<height then select 'you small'; else select 'you ==='; end if; end;
【3】存储过程调用(MySQL) call procedureName()
【4】存储过程的编程(MySQL)
- 存储过程是可以编程的( 在begin 和 end 之间 ),可以有 变量,表达式,控制结构
(1)变量:
- 定义:用declare来声明变量
格式:
declare 变量名 变量类型 default 默认初始值;
也可以给变量赋默认值 如 declare gnum int;赋值:set 变量名=值(或表达式); 如set gnum=gnum+old.much;
或者 set 变量名:=值,如 set gnum:=gunm+old.num;- 使用:直接使用
(2)表达式: +-*/%都可以正常的使用
(3)控制结构:
1)分支机构
①if双分支
if search_condition then statement_list [elseif search_condition then statement_list] ... [else statement_list] end if;
②case多分支
case 变量 when 常量 then 表达式; when 常量 then 表达式; when 常量 then 表达式; else 表达式(都未中 相当于default); end case;
- 2)循环结构
①while循环 while search_condition DO ... statement_list end while; ②repeat循环(相当于 do while) repeat statement_list until search_condition end repeat;
—
【5】实例( C#调用SQL Server2008存储过程,并封装结果 )
需求 1.查询全部的学生信息 2.插入一条学生的信息
1.创建学生表
为了方便演示,假设学生只有三个属性 :学号,姓名,专业
/* *@function:学生表 *@author:Stone6762 */ create table student ( id char(9) unique, name char(50), major char(64), primary key (id), );
2.创建存储过程
-- =============================================-- Author: Stone6762-- Create date: 2016-10-1 08:12:05-- Description: 获取全部的学生信息-- 无参的存储过程的创建-- =============================================CREATE PROCEDURE Stu_GetAll AS BEGIN SELECT id,name,major FROM student ORDER BY id;END-- =============================================-- Author: Stone6762-- Create date: 2016-10-1 09:31:08-- Description: 学生表的插入-- 有参的存储过程的创建-- =============================================CREATE PROCEDURE Stu_Insert @Nid varchar(9) , @Nname varchar(50), @Nmajor varchar(7)ASBEGIN insert into student(id,name,major)values(@Nid,@Nname,@Nmajor);END
—
3. C# 链接数据库,调用存储过程,并将数据封装
—
public class MySSDBSP { struct Student { public string id; public string name; public string major; } //因为会多次调用SqlConnection,故此将其写入构造函数里 private SqlConnection myConnection = null; public OFWZ3() { //读取配置文件里的数据库连接信息 //server=服务器名;uid=账号;pwd=密码;database=要连接的数据库;Trusted_Connection=no StreamReader sr = new StreamReader("文件名路径\\Config.txt", Encoding.UTF8); string connInfor = sr.ReadLine().Trim(); sr.Close(); myConnection = new SqlConnection(connInfor); } #region 操作学生表 /// 将学生的信息存储到数据库中 protected bool MyStuSave2DB(Student s) { //1.获取链接-->构造函数已经做了 //2.建立可以执行SQL语句的SqlCommand SqlCommand MyCommand = new SqlCommand("Stu_Insert", myConnection); //定义一个数据库操作指令 //3.指明调用的是存储过程 MyCommand.CommandType = CommandType.StoredProcedure;//设置该语句是读取存储过程的 //4.给存储过程传递参数 SqlParameter id = new SqlParameter("@Nid", s.id); SqlParameter name = new SqlParameter("@Nname", s.name); SqlParameter major = new SqlParameter("@Nmajor", s.major); MyCommand.Parameters.Add(id); MyCommand.Parameters.Add(name); MyCommand.Parameters.Add(major); //5.执行存储过程 try//异常处理 { myConnection.Open(); MyCommand.ExecuteNonQuery(); myConnection.Close(); } catch (Exception ex) { throw new Exception(ex.ToString()); } return true; } /// 读取学生表中所有的数据 protected Student[] getAllStuFromDB() { //1.获取链接--->构造函数已经做了 //2..建立可以执行SQL语句的SqlCommand SqlCommand MyCommand = new SqlCommand("Stu_GetAll", myConnection); //定义一个数据库操作指令 //3.指明调用的是存储过程 MyCommand.CommandType = CommandType.StoredProcedure;//设置该语句是读取存储过程的 //4.设置数据适配器 SqlDataAdapter SelectAdapter = new SqlDataAdapter();//定义一个数据适配器 SelectAdapter.SelectCommand = MyCommand;//定义数据适配器的操作指令 //5.执行存储过程 try { myConnection.Open();//打开数据库连接 SelectAdapter.SelectCommand.ExecuteNonQuery();//执行数据库查询指令 myConnection.Close();//关闭数据库 } catch (Exception e) { throw new Exception(e.ToString()); } //6.将结果存储到DataSet里 DataSet MyDataSet = new DataSet();//定义一个数据集 SelectAdapter.Fill(MyDataSet);//填充数据集 //7.解析DataSet中的数据,并将其封装到Student数组里 DataTable dt = MyDataSet.Tables[0];//获取查询的结果表(因为只有一个) return getStuFroTable(dt);//将DataTable里存储的学生信息封装到结构体数组里 } /// 将DataTable里存储的学生信息封装到结构体数组里 private Student[] getStuFroTable(DataTable dt) { Student[] students = new Student[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++)//遍历行 { students[i].id = dt.Rows[i]["id"].Trim(); students[i].name = ((string)dt.Rows[i]["name"]).Trim(); students[i].major = ((string)dt.Rows[i]["major"]).Trim(); } return students; } #endregion }
0 0
- 浅谈存储过程
- 浅谈存储过程
- 浅谈Java调用存储过程
- 浅谈存储过程和触发器
- 浅谈数据库中的存储过程
- 浅谈数据库中的存储过程
- 浅谈触发器和存储过程
- 浅谈数据库中的存储过程
- 浅谈数据库中的存储过程
- 浅谈数据库中的存储过程
- 浅谈数据库中的存储过程
- 浅谈数据库中的存储过程
- 浅谈Java存储过程调用(转)
- 黑马程序员-浅谈存储过程和触发器
- 浅谈一下mySql中创建存储过程
- 浅谈sql server数据库的存储过程
- 浅谈sql存储过程和调用
- J2EE综合--浅谈Java程序员的存储过程
- delphi 全局变量的定义与初始化赋值
- typedef使用的一些总结
- Leetcode 323. Number of Connected Components in an Undirected Graph
- 哈希冲突解决办法
- 学ARM处理器要看的那些文档(持续整理)
- 浅谈存储过程
- java8新特性探究(一)optional类
- 【AR】DroidCam笔记本调用手机摄像头(smartphone's camera as pc webcam)
- 嵌入式系统学习(五)-NanoPi2基础实例开发(裸机程序按钮控制LED灯)
- 面向对象_继承中的面试题3
- Android图片的裁剪
- java8新特性探究(二)Lambda表达式
- oracle 11g安装图解
- C++ 智能指针详解