相关知识:

  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. 代码
     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient; namespace ConsoleApplication12
    {
    class Program
    {
    static string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root";
    static SqlConnection conn = new SqlConnection(strConn);
    static void Main(string[] args)
    {
    //调用不带参数的存储过程
    //CallProcedureGetAll();
    //调用带输入参数的存储过程
    //CallProcedureInsert();
    //调用带输入和输出参数的存储过程
    //CallProcedureLogin();
    } static void CallProcedureGetAll()
    {
    string sql = "forAccountGetAll";//存储过程名字 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    da.SelectCommand.CommandType = CommandType.StoredProcedure;//指定调用存储过程(默认是SQL文本) DataSet ds = new DataSet();
    da.Fill(ds, "AccountGetAll"); DataTable dt = ds.Tables["AccountGetAll"];
    DataView dv = new DataView(dt); dv.Sort = "AccountID ASC"; Console.WriteLine("调用存储过程 forAccountGetAll:"); foreach (DataRowView drv in dv)
    {
    Console.WriteLine("{0}:{1},{2}", drv["AccountID"], drv["AccountName"], drv["password"]);
    }
    } static void CallProcedureInsert()
    {
    string sql = "forAccountInsert";
    SqlCommand cmd = new SqlCommand(sql, conn); cmd.CommandType = CommandType.StoredProcedure;
    //设置参数值,并添加到Command对象的参数集合中
    cmd.Parameters.AddWithValue("@AccountID", );
    cmd.Parameters.AddWithValue("@AccountName", "new");
    cmd.Parameters.AddWithValue("@password", ""); conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    } static void CallProcedureLogin()
    {
    string sql = "forAccountLogin";
    SqlCommand cmd = new SqlCommand(sql, conn); cmd.CommandType = CommandType.StoredProcedure;
    //设置输入参数值
    cmd.Parameters.AddWithValue("@AccountName", "Joe");
    cmd.Parameters.AddWithValue("@password", "");
    //准备输出参数
    SqlParameter param = new SqlParameter("@AccountID", SqlDbType.Int);
    param.Direction = ParameterDirection.Output;//指定是输出参数 cmd.Parameters.Add(param); // 将输出参数添加到Command对象的参数集合中 conn.Open();
    cmd.ExecuteNonQuery();
    //如果没有满足条件的用户名和密码,那么输出参数@AccountID的值将为DBNull.Value
    if (param.Value == DBNull.Value)
    {
    Console.WriteLine("failed");
    }
    else
    {
    Console.WriteLine("Done");
    }
    conn.Close();
    }
    }
    }

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

  1. ADO.NET系列之事务和调用存储过程

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...

  2. 数据库复习总结(20)-存储过程以及.net调用存储过程

    一.存储过程(注意区分将一段select语句进行封装叫做视图)(1)将一段t-sql脚本进行封装,以完成一个逻辑操作(2)创建存储过程:            create proc 名称      ...

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

    // AccessSqlserverByAdo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h ...

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

    其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...

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

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

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

    在使用”执行 SQL 任务“组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Nam ...

  7. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  8. MyBatis学习笔记(六)——调用存储过程

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...

  9. MySQL学习笔记:调用存储过程或函数报1418错误

    问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...

随机推荐

  1. 高性能HTTP加速器Varnish安装与配置

    导读 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,它采用了全新的软件体系结构,和现在的硬件体系配合紧密.下面就由我给大家简单说说他的安装与配置. 安装 安装pcre 如果没有安装 ...

  2. Linux / Unix Command: bunzip2--reference

    http://linux.about.com/library/cmd/blcmdl1_bunzip2.htm NAME bzip2, bunzip2 - a block-sorting file co ...

  3. WPF 之 左键弹出操作菜单,并禁用右键菜单

    在目前的WPF版本中,很多的控件都有一个ContextMenu的属性,可以设置组件的右键菜单,这点确实是很方便,但是有些时候我们可能会需要当单击鼠标左键才弹出这个ContextMenu,而不是单击鼠标 ...

  4. jquery的学习

    可选的 speed 参数规定隐藏/显示的速度,可以取以下值:"slow"."fast" 或毫秒.可选的 callback 参数是动画 100% 完成后所执行的函 ...

  5. spring WebServiceTemplate 调用 axis1.4 发布的webservice

     前言: 最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用ax ...

  6. ajax步骤和理解

    步骤: 1.利用html+css来实现页面,表达信息: 2.用XMLHttpRequest和web服务器进行数据的异步交换 3.运营js操作DOM,实现动态局部刷新: XMLHttpRequest对象 ...

  7. JQuery POST请求乱码...

    引言: 在JQuery的Ajax POST请求中,进行请求,其中的中文在后台,显示为乱码,该如何解决呢? 问题的引入: var regid = $('#oregion').combobox('getV ...

  8. Spring Data:企业级Java的现代数据访问技术(影印版)

    <Spring Data:企业级Java的现代数据访问技术(影印版)>基本信息原书名:Spring Data:Modern Data Access for Enterprise Java作 ...

  9. xe5 android listbox的 TMetropolisUIListBoxItem

    listbox实现以下效果: 关键代码,采用数据集的方式 type PpatientData=^RpatientData; RpatientData= record patient_id:string ...

  10. 剑指Offer21 二叉树的层序遍历

    /************************************************************************* > File Name: 21_PrintT ...