zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Tornado入门2
    Tornado框架入门
    Nginx下载及安装
    串口通信工程笔记一
    串口通信工程笔记之协议设计
    串口通信之并发与单步
    串口通信属性及事件解析
    串口通信之超时
    VC程序Debug版本和Release版本运行不一致问题
    串口通信之DataReceive事件触发时机
  • 原文地址:https://www.cnblogs.com/chenguangqiao/p/4355044.html
Copyright © 2011-2022 走看看