目录

一、存储过程概念

二、存储过程的操作

1.创建:

2.调用

4.在程序中调用存储过程

4.Ado.net中调用存储过程与sql语句区别

更新项目:将登录按钮原方法改为新方法

三、 存储过程与类库的结合

更新项目:登录按钮



一、存储过程概念

存储过程就像数据库中运行方法(函数)和C#中的方法一样,由存储过程名、存储过程参数组成,可以有返回值 

if、else、while、变量、insert、select都可以在存储过程中使用。

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

优点:

  • 执行速度更快,数据库中保存的存储过程都是编译过的;
  • 允许模块化程序设计—类似方法的复用  提高系统安全性—防止SQL注入
  • 减少网络流通量—只需要传入存储过程名称

缺点:

  • 存储过程太多的话,所有的压力都由数据库来承担

种类:

  • 系统存储过程 以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
  • 本地存储过程 用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
  • 临时存储过程一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
  • 远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
  • 扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

二、存储过程的操作

1.创建:

 CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]

[(参数#1,…参数#1024)]

[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION]

AS 程序行 --存储过程要执行的操作

eg:建立一个简单的存储过程order_tot_amt,根据用户输入的订单ID号码(@o_id),由订单明细表 (orderdetails)中计算该订单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序。

CREATE PROCEDURE order_tot_amt

@o_id int, @p_tot int output

AS SELECT @p_tot = sum(Unitprice*Quantity)

FROM orderdetails  WHERE orderid=@o_id

2.调用

exec Procedure_Name [参数名] --调用存储过程Procedure_Name。

3.删除

drop procedure sp_name

注意事项:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

eg:创建存储过程实现验证功能,如果成功则返回,失败,返回

create procedure proc_Validate

@User varchar(20),  --参数:用户名 @Pwd varchar(20),  --参数:密码 @Flag bit output  --参数:返回值

as begin

if exists(select * from UserInfo where UserName=@User and UserPwd=@Pwd)   select @Flag= 1

else   select @Flag= 0  end

--删除存储过程

drop procedure proc_Validate

--调用存储过程

declare @result bit;

declare @dd bit;

exec proc_Validate '张三','123456',@result output

select @result

4.在程序中调用存储过程

a.数据库语句变成存储过程名称;

b.command命令类型改成存储过程;

c.添加参数(参数名称与存储过程名称严格一致!!!),输出参数的direction置为output

eg:

        private void button1_Click(object sender, EventArgs e){//1、创建连接对象using (SqlConnection con=new SqlConnection(strCon)){//6、调用open方法打开con.Open();//2、创建SQL语句 sql语句中放的是存储过程的名称string sql = "proc_UserCheck";//3、实例化一个Command对象SqlCommand cmd = new SqlCommand(sql, con);//4、Command的类型选取成存储过程cmd.CommandType = CommandType.StoredProcedure;//5、为Command对象添加参数,切记切记:参数名称要与存储过程的名称严格一致。//用户名SqlParameter par1 = new SqlParameter("@User", SqlDbType.VarChar, 30) { Value=textBox1.Text.Trim()};//密码SqlParameter par2 = new SqlParameter("@Pwd", SqlDbType.VarChar, 20) { Value = textBox2.Text.Trim() };//输出参数SqlParameter par3 = new SqlParameter("@Flag", SqlDbType.Bit);par3.Direction = ParameterDirection.Output;cmd.Parameters.Add(par1);cmd.Parameters.Add(par2);cmd.Parameters.Add(par3);try{//7、执行Command命令,得到结果cmd.ExecuteNonQuery();object b = cmd.Parameters["@Flag"].Value;bool result = Convert.ToBoolean(b);if (result==true){label3.Text = "该账号合法,登录成功";}else{label3.Text = "该账号非法,不准登录!";}}catch (Exception ex){MessageBox.Show(ex.Message);}}}

4.Ado.net中调用存储过程与sql语句区别

  • v把SQL语句变成存储过程名称
  • v设置SQLCommand对象的CommandType为CommandType.StoredProcedure
  • v根据存储过程的参数设置SQLCommand的参数
  • v如果有输出参数设置输出参数的Direction属性为:Direction=ParameterDirection.Output

cmd.ExecuteNonQuery();
    object b=cmd.Parameters["@flag"].Value;    
    将b转换成对应的类型
    bool b=Convert.ToBoolean(b);

注意:如果是通过Command调用ExecuteReader执行存储过程,如果想获取输出参数,必须等到关闭Reader对象以后,才能获取的到。

更新项目:将登录按钮原方法改为新方法

原:

        private void btnLogin_Click(object sender, EventArgs e){//编写sql语句,将sql语句赋值给CommandText属性string sql = string.Format("select COUNT(*) from Users where userName=@userName and Password=@Password");//准备参数SqlParameter[] pas = {  //实例化一个参数对象 指定名字 类型 长度  参数的值new SqlParameter("@userName", SqlDbType.VarChar,50){ Value=txtName.Text.Trim().ToString()},new SqlParameter("@Password", SqlDbType.VarChar,50){ Value=txtPwd.Text.Trim().ToString()},};//调用类库中的方法执行object b = sqlHelper.sqlExecuteScalar(sql, pas);if ((int)b > 0){Main f1 = new Main();//实例一个Main窗体f1.StartPosition = FormStartPosition.CenterScreen;//窗体显示于屏幕中间f1.Show();this.Visible = false;//隐藏登录窗体}else{MessageBox.Show("用户名或密码错误!");}}

新:

        private void btnLogin_Click(object sender, EventArgs e){using (SqlConnection con = new SqlConnection(sqlHelper.strCon)){string sql = "proc_UserCheck";SqlCommand cmd = new SqlCommand(sql, con);cmd.CommandType = CommandType.StoredProcedure;//准备参数SqlParameter[] pas = {  //实例化一个参数对象 指定名字 类型 长度  参数的值new SqlParameter("@User", SqlDbType.VarChar,50){ Value=txtName.Text.Trim().ToString()},new SqlParameter("@Pwd", SqlDbType.VarChar,50){ Value=txtPwd.Text.Trim().ToString()},new SqlParameter("@flag", SqlDbType.Bit) { Direction=ParameterDirection.Output}};cmd.Parameters.AddRange(pas);try{if (con.State == ConnectionState.Closed){con.Open();cmd.ExecuteNonQuery();object b = cmd.Parameters["@flag"].Value;if (Convert.ToBoolean(b)){MessageBox.Show("登陆成功");Main f1 = new Main();//实例一个Main窗体f1.StartPosition = FormStartPosition.CenterScreen;//窗体显示于屏幕中间f1.Show();this.Visible = false;//隐藏登录窗体}else{MessageBox.Show("用户名或密码错误!");}}}catch (Exception ex){MessageBox.Show(ex.ToString());throw;}}}

三、 存储过程与类库的结合

在项目中使用类库中的方法,执行存储过程,项目中具体代码见下:

1、将该类库的dll文件拷贝到要使用的项目中

2、右击引用--》添加引用--》浏览--》找到该dll,点击确定

3、右击引用--》添加引用--》程序集--》System.Configuration  -->点击确定

4、在App.Config中实现连接字符串,将以下代码拷贝到App.Config中

<!--配置方式一:只能配置数据库连接字符串,不能配置别的-->
  <connectionStrings>
    <add connectionString="data source=.;database=ttt;user id=sa;pwd=admin123" name="Con1"/>
  </connectionStrings>
  
  <!--配置方式二:该软件默认选择汉语,可以在配置文件中指定-->
  <appSettings>
    <add key="Con2" value="data source=.;database=ttt;user id=sa;pwd=admin123"/>
  </appSettings>
  
 5、使用using HuaXingSqlHelper 添加对该dll的引用
 
 6、在程序中调用类库中的方法

类库内容:

        /// <summary>/// 执行SQL语句或存储过程,返回cmd/// </summary>/// <param name="sql">要执行的sql语句或存储过程名称</param>/// <param name="type">Command类型:是Text还是存储过程</param>/// <param name="pas">参数</param>/// <returns></returns>public static SqlCommand HuaXingExecuteNonQueryWithProcedureReturnCmd(string sql, CommandType type, params SqlParameter[] pas){using (SqlConnection con=new SqlConnection(strCon)){//创建Command对象SqlCommand cmd = new SqlCommand(sql, con);//指定Command类型cmd.CommandType = type;//赋参数if (pas != null){cmd.Parameters.AddRange(pas);}//打开数据库con.Open();//执行命令cmd.ExecuteNonQuery();return cmd;}}/// <summary>/// 执行SQL语句或存储过程,返回受影响的行数/// </summary>/// <param name="sql">要执行的sql语句或存储过程名称</param>/// <param name="type">Command类型:是Text还是存储过程</param>/// <param name="pas">参数</param>/// <returns></returns>public static int HuaXingExecuteNonQueryWithProcedure(string sql, CommandType type, params SqlParameter[] pas){using (SqlConnection con = new SqlConnection(strCon)){//创建Command对象SqlCommand cmd = new SqlCommand(sql, con);//指定Command类型cmd.CommandType = type;//赋参数if (pas != null){cmd.Parameters.AddRange(pas);}//打开数据库con.Open();//执行命令return cmd.ExecuteNonQuery();}}/// <summary>/// 执行SQL或存储过程,返回第一行第一列的值/// </summary>/// <param name="sql"></param>/// <param name="type"></param>/// <param name="pars"></param>/// <returns></returns>public static object HuaXingExecuteScalarWithProcedure(string sql, CommandType type, params SqlParameter[] pars){using (SqlConnection con=new SqlConnection(strCon)){//创建Command对象SqlCommand cmd = new SqlCommand(sql, con);//指定Command类型cmd.CommandType = type;//指定参数if (pars != null){cmd.Parameters.AddRange(pars);}//打开连接con.Open();//执行命令return cmd.ExecuteScalar();}}/// <summary>/// 执行SQL语句或存储过程,返回Reader对象/// </summary>/// <param name="sql"></param>/// <param name="type"></param>/// <param name="pars"></param>/// <returns></returns>public static SqlDataReader HuaXingExecuteReaderWithProcedure(string sql, CommandType type, params SqlParameter[] pars){//创建连接对象SqlConnection con = new SqlConnection(strCon);try{//创建Command对象SqlCommand cmd = new SqlCommand(sql, con);//指定Command类型cmd.CommandType = type;//指定参数if (pars != null){cmd.Parameters.AddRange(pars);}//打开连接con.Open();//执行命令return cmd.ExecuteReader(CommandBehavior.CloseConnection);}catch {con.Close();return null;}}

更新项目:登录按钮

原:

private void btnLogin_Click(object sender, EventArgs e)
        {

using (SqlConnection con = new SqlConnection(sqlHelper.strCon))
            {
                //创建SQL语句 sql语句中放的是存储过程的名称
                string sql = "proc_UserCheck";
                SqlCommand cmd = new SqlCommand(sql, con);
                //Command的类型选取成存储过程
                cmd.CommandType = CommandType.StoredProcedure;
                //准备参数
                SqlParameter[] pas = {  //实例化一个参数对象 指定名字 类型 长度  参数的值
                new SqlParameter("@User", SqlDbType.VarChar,50){ Value=txtName.Text.Trim().ToString()},
                new SqlParameter("@Pwd", SqlDbType.VarChar,50){ Value=txtPwd.Text.Trim().ToString()},
                new SqlParameter("@flag", SqlDbType.Bit) { Direction=ParameterDirection.Output}
            };
                cmd.Parameters.AddRange(pas);
                try
                {
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                        cmd.ExecuteNonQuery();
                        object b = cmd.Parameters["@flag"].Value;
                        if (Convert.ToBoolean(b))
                        {
                            MessageBox.Show("登陆成功");
                            Main f1 = new Main();//实例一个Main窗体
                            f1.StartPosition = FormStartPosition.CenterScreen;//窗体显示于屏幕中间
                            f1.Show();
                            this.Visible = false;//隐藏登录窗体
                        }
                        else
                        {
                            MessageBox.Show("用户名或密码错误!");
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    throw;
                }
            }
        }

现:

 private void btnLogin_Click(object sender, EventArgs e){string sql = "proc_UserCheck";//准备参数SqlParameter[] pas = {  //实例化一个参数对象 指定名字 类型 长度  参数的值new SqlParameter("@User", SqlDbType.VarChar,50){ Value=txtName.Text.Trim().ToString()},new SqlParameter("@Pwd", SqlDbType.VarChar,50){ Value=txtPwd.Text.Trim().ToString()},new SqlParameter("@flag", SqlDbType.Bit) { Direction=ParameterDirection.Output}};SqlCommand cmd = sqlHelper.sqlExecuteNonQueryWithProcedureReturnCmd(sql, CommandType.StoredProcedure, pas);object b = cmd.Parameters["@flag"].Value;if (Convert.ToBoolean(b)){MessageBox.Show("登陆成功");Main f1 = new Main();//实例一个Main窗体f1.StartPosition = FormStartPosition.CenterScreen;//窗体显示于屏幕中间f1.Show();this.Visible = false;//隐藏登录窗体}else{MessageBox.Show("用户名或密码错误!");}}

C#基础知识 Day28 数据库高阶 存储过程相关推荐

  1. 阿里巴巴《SQL基础知识》PDF高清版,限时下载!

    内容简介 <SQL基础知识第3版>和 <数据库设计规范文档大全>是为新手同学特地准备的入门文档. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...

  2. oracle数据库中基础知识,oracle数据库基础知识

    oracle数据库基础知识 -- End loop --1 declare pnum number(4):=0; begin while pnum < 10 loop dbms_output.p ...

  3. 计算机数据库基础知识答案,数据库基础题库含答案.doc

    数据库基础题库含答案,数据库基础知识题库,数据库基础题库,数据库题库,数据库考试题库,题库数据库设计,计算机二级数据库题库,access数据库题库,数据库选择题题库,计算机三级数据库题库 数据库基础考 ...

  4. oracle数据库sql基础知识,Oracle数据库基础知识为内部培训资料.doc

    PAGE 1 课程 IL001100 ORACLE数据库基础知识 ISSUE1.0 开心Java整理 IL001100 ORACLE数据库基础知识 ISSUE1.0 目录 PAGE 1 PAGE 45 ...

  5. MySQL基础知识——创建数据库和表

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL基础知识汇总 SQL高级知识汇总 创建数据库语法 CREATE TABLE tablename 或 CREATE TABLE `ta ...

  6. Android基础知识 - SQLite数据库的最佳实践(使用事务、升级数据库的最佳写法)

    目录 使用事务 升级数据库的最佳写法 使用事务 SQLite数据库时支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成. 那么在什么情况下才需要使用事务呢? 想象以下场景, ...

  7. python基础之常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  8. 一天一个小知识:KT高阶函数

    让我们从匿名函数聊起 我们听说过有匿名类,那作为一等公民的函数就也会有匿名函数 什么是一等公民? 我们知道Java的一等公民是类,就连一个普通的程序入口也要用类包一下.而kotlin中除了类是一等公民 ...

  9. sql管理:索引超出范围必须为非负值并小于集合大小_java面试基础知识-数据库基础知识(数据库索引部分)...

    1.1数据库架构: 如何设计一个关系型数据库? 存储模块(文件系统)用块或者页作为存储单位 程序实例: 存储管理 缓存机制 不宜过大,要有淘汰机制 SQL解析 日志管理 权限划分 容灾机制 索引管理 ...

最新文章

  1. OSChina 技术周刊第九期 —— 每周技术精选,值得一看!
  2. c 定义结构体时提示应输入声明_C语言结构体的坑很多,这6大方法千万要记住!...
  3. 25个python相关的基础概念总结
  4. 面试系列-Memcached面试专题
  5. WinForm 的定时器使用
  6. char与byte差异
  7. ionic安装拍照选照片插件
  8. php获取qqkey源码,易语言取QQKEY源码
  9. windows下CMD常用命令
  10. 恶趣装逼制作神器,模板丰富的微信小程序
  11. 热电阻温度计 电阻温度探测器 直接浸入式清洁传感器 精密RTD 美国Burns 胶囊式铂电阻温度检测器 迷你RTD整体热电偶套管 气温传感器 测温传感器 温度传感器 温度传感器生产厂家 温度变送器
  12. 【源码】基于PMSG的风力发电机组仿真与建模
  13. 平台建设的7大问题:蚂蚁AI平台实践深度总结
  14. js html显示emoji表情,canvas绘制一个常用的emoji表情
  15. 新开业和新签约酒店 | 上海中优城市万豪、杭州明豪voco酒店陆续开业;温德姆集团今年上半年签约59家亚太区新酒店...
  16. jsp130ssm妇女联合会管理系统
  17. MVC |分部视图 PartialView()
  18. PHP修改图片上的文字,ps图片中怎么更改文字
  19. 爬虫爬取糗事百科图片数据
  20. python模糊搜索_在Python中使用Whoosh进行模糊搜索

热门文章

  1. 【GNN】图技术在美团外卖下的场景化应用及探索
  2. 计算机二级vf索引建立,计算机二级VFP辅导:在VFP中建立索引文件的方法
  3. 【APP 测试】APP 性能测试工具:ADB 安装
  4. SQL-截取字符串函数
  5. SQL截取字符串函数
  6. Shell Date命令
  7. 基于Scipy fiting Curve 输出函数
  8. Pygame Zero(pgzrun)游戏库介绍
  9. input限定只能输入非负整数
  10. oracle中中英文段落划分实现