ADO.NET笔记——调用存储过程

相关知识:

  1. 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句。
  2. 存储过程有下列优点:
    • 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行。调用的时候不必在此解析语法和编译,因此效率比采用常规SQL语句高
    • 带参数的存储过程在一定程度上可以降低SQL注入攻击的风险
    • 存储过程便于在数据库服务器上统一管理,减少了程序员维护SQL代码的工作量
    • 存储过程有利于重用某些数据库的访问逻辑

代码示例:

  1. 在数据库中创建存储过程(沿用SQLInjection案例描述的数据库。请确保Account表中有若干行数据)

    • 不带参数的存储过程:forAccountGetAll

          CREATE PROCEDURE forAccountGetAll
          AS
          SELECT AccountID, AccountName, Password FROM Account
    • 带输入参数的存储过程:forAccountInsert

          CREATE PROCEDURE forAccountInsert
          (@AccountID int,
           @AccountName nvarchar(50),
           @Password nvarchar(50)
           )AS
           INSERT INTO Account(AccountID, AccountName, password) VALUES(@AccountID, @AccountName, @password)
    • 带输入和输出从参数的存储过程:根据用户名和密码,找到匹配的AccountID作为输出参数:forAccountLogin

           CREATE PROCEDURE forAccountLogin
           (@AccountName nvarchar(50),
            @Password nvarchar(50),
            @AccountID int output
            )AS
            SELECT @AccountID=AccountID FROM Account WHERE AccountName=@AccountName AND password=@password
  2. 代码

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Data;
     7 using System.Data.SqlClient;
     8
     9 namespace ConsoleApplication12
    10 {
    11     class Program
    12     {
    13         static string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root";
    14         static SqlConnection conn = new SqlConnection(strConn);
    15         static void Main(string[] args)
    16         {
    17             //调用不带参数的存储过程
    18             //CallProcedureGetAll();
    19             //调用带输入参数的存储过程
    20             //CallProcedureInsert();
    21             //调用带输入和输出参数的存储过程
    22             //CallProcedureLogin();
    23         }
    24
    25         static void CallProcedureGetAll()
    26         {
    27             string sql = "forAccountGetAll";//存储过程名字
    28
    29             SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    30             da.SelectCommand.CommandType = CommandType.StoredProcedure;//指定调用存储过程(默认是SQL文本)
    31
    32             DataSet ds = new DataSet();
    33             da.Fill(ds, "AccountGetAll");
    34
    35             DataTable dt = ds.Tables["AccountGetAll"];
    36             DataView dv = new DataView(dt);
    37
    38             dv.Sort = "AccountID ASC";
    39
    40             Console.WriteLine("调用存储过程 forAccountGetAll:");
    41
    42             foreach (DataRowView drv in dv)
    43             {
    44                 Console.WriteLine("{0}:{1},{2}", drv["AccountID"], drv["AccountName"], drv["password"]);
    45             }
    46         }
    47
    48         static void CallProcedureInsert()
    49         {
    50             string sql = "forAccountInsert";
    51             SqlCommand cmd = new SqlCommand(sql, conn);
    52
    53             cmd.CommandType = CommandType.StoredProcedure;
    54             //设置参数值,并添加到Command对象的参数集合中
    55             cmd.Parameters.AddWithValue("@AccountID", 100);
    56             cmd.Parameters.AddWithValue("@AccountName", "new");
    57             cmd.Parameters.AddWithValue("@password", "123456");
    58
    59             conn.Open();
    60             cmd.ExecuteNonQuery();
    61             conn.Close();
    62         }
    63
    64         static void CallProcedureLogin()
    65         {
    66             string sql = "forAccountLogin";
    67             SqlCommand cmd = new SqlCommand(sql, conn);
    68
    69             cmd.CommandType = CommandType.StoredProcedure;
    70             //设置输入参数值
    71             cmd.Parameters.AddWithValue("@AccountName", "Joe");
    72             cmd.Parameters.AddWithValue("@password", "123456");
    73             //准备输出参数
    74             SqlParameter param = new SqlParameter("@AccountID", SqlDbType.Int);
    75             param.Direction = ParameterDirection.Output;//指定是输出参数
    76
    77             cmd.Parameters.Add(param); // 将输出参数添加到Command对象的参数集合中
    78
    79             conn.Open();
    80             cmd.ExecuteNonQuery();
    81             //如果没有满足条件的用户名和密码,那么输出参数@AccountID的值将为DBNull.Value
    82             if (param.Value == DBNull.Value)
    83             {
    84                 Console.WriteLine("failed");
    85             }
    86             else
    87             {
    88                 Console.WriteLine("Done");
    89             }
    90             conn.Close();
    91         }
    92     }
    93 }
时间: 2024-08-08 13:59:14

ADO.NET笔记——调用存储过程的相关文章

Mybatis学习笔记-调用存储过程

需求:查询得到男性或女性的数量,如果传入的是0就得到男性的数量,如果是1就得到女性的数量 数据库名mybatis  数据库表users create table users(           id int primary key auto_increment,           name varchar(10),          sex char(2) ); 创建存储过程 DELIMITER $ CREATE PROCEDURE mybatis.ges_user_count(IN sex

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程

其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PROCEDURE [dbo].[sp_InsertAccount]    -- Add the parameters for the stored procedure here   @Account_ID int,   @Account_FirstName varchar(32),   @Accoun

SSIS使用OleDB和Ado.Net两种方式调用 存储过程

在使用"执行 SQL 任务"组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Name的0代表第一个参数,1代表第二个参数 当我们使用Ado.net 方式的时候,注意要设置IsQueryStoredProcedure为True Sqlstatement 填写存储过程的名字 而参数设置需要和存储过程的参数名字保持一致 就到这了,欢迎大家来补充解释... SSIS使用OleD

c++ ado 调用存储过程并得到输出参数和返回值

// AccessSqlserverByAdo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #include <iostream> #include <string> using namespace std; #import "C:\Program Files\Common Files\System\ado\msado15.dll" rename

JDBC学习笔记(12):使用JDBC调用存储过程与批处理

存储过程:是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.    存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快.同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量.简单网络负担. 创建存储过程: DELIMITER $$ DROP

MyBatis入门学习教程-调用存储过程

一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男"); 8 insert into p_user(name,sex) values('B',&qu

MySQL笔记---视图,存储过程, 触发器的使用入门

大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只能停留在名称的阶段.最近看完了一本薄薄的小书叫<MySQL必知必会>,记了不少笔记,也自己上手实践了一番,总算是了解了些皮毛. 下面通过实例来具体了解这几个东西,首先我的样例表是这样的. 视图: 什么是视图? 视图是虚拟的表,本身并不包含数据,通过一个例子,来更好地理解视图: 假设上述表中,我需要

导入Excel用户表,调用存储过程

花了一天半的时间学习了一下导入Excel用户表,调用存储过程,主要是学习存储过程.因为之前没有具体在项目中应用过. 这里我们采用导入Excel到临时表,然后存储过程中读取临时表判断数据类型和数据格式,然后保存到正式表. 导入Excel采用spring 的POI技术. 本文内容较多,请选择性阅读. controller里面的代码: /**  * Excel导入用户表,调用存储过程,先导入临时表,再在存储过程中判断,判断通过后导入正式表,错误的则记录错误日志表中. lijianbo  *   * @