ADO.NET笔记——调用存储过程
相关知识:
- 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句。
- 存储过程有下列优点:
- 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行。调用的时候不必在此解析语法和编译,因此效率比采用常规SQL语句高
- 带参数的存储过程在一定程度上可以降低SQL注入攻击的风险
- 存储过程便于在数据库服务器上统一管理,减少了程序员维护SQL代码的工作量
- 存储过程有利于重用某些数据库的访问逻辑
代码示例:
- 在数据库中创建存储过程(沿用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
- 代码
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笔记——调用存储过程的更多相关文章
- ADO.NET系列之事务和调用存储过程
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...
- 数据库复习总结(20)-存储过程以及.net调用存储过程
一.存储过程(注意区分将一段select语句进行封装叫做视图)(1)将一段t-sql脚本进行封装,以完成一个逻辑操作(2)创建存储过程: create proc 名称 ...
- c++ ado 调用存储过程并得到输出参数和返回值
// AccessSqlserverByAdo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h ...
- IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程
其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- SSIS使用OleDB和Ado.Net两种方式调用 存储过程
在使用”执行 SQL 任务“组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Nam ...
- ADO.NET访问SQL Server调用存储过程带回参
1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...
- MyBatis学习笔记(六)——调用存储过程
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...
- MySQL学习笔记:调用存储过程或函数报1418错误
问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...
随机推荐
- Quoit Design
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- Maven-编译打包
1. 打包时忽略测试阶段 mvn clean mvn package -DskipTests
- 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用
我们在ListView的Adapter的getView方法里面经常会调用两个参数的inflate方法, mInflater.inflate(R.layout.adv_viewpager, null); ...
- java中的容器问题
小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...
- [UML]UML之开篇
前言 大学时,学习软件工程时,学到了UML,由于当时接触项目太少,认识不清,再加上毕业后一直忙于coding,很少有时间去真正的认识和学习UML. 现在感觉有必要去回头看看这些东西啦. 什么是UML ...
- Kinect For Windows V2开发日志二:Kinect V2的基本参数
以下内容节选自Heresy的博客: 彩色影像:1920 x 1080 @ 30 / 15 FPS(根据环境亮度) 深度影像:512 x 424 @ 30 FPS.16bit 距离值(mm).可侦测 ...
- JSON解析总结2
使用json-lib-2.4-jdk15.jar JSON工具类: import java.util.List; import net.sf.json.JSONArray; import net.sf ...
- 转: 学习开源项目的若干建议(infoq)
转: http://www.infoq.com/cn/news/2014/04/learn-open-source 学习开源项目的若干建议 作者 崔康 发布于 2014年4月11日 | 注意:GTLC ...
- Python之随机数
import numpy as np list = range(3) # 0 1 2 np.random.shuffle(list)#2 1 3,打乱了list import randomprint ...
- VS预生成事件命令行 和 生成后事件命令行
宏 说明 $(ConfigurationName) 当前项目配置的名称( ...