********************************
使用 C# 调用sqlserver存储过程
********************************// 1. 创建 存储过程
create procedure proc_name
(
@para1 int,
@para2 varchar(20) output,
@para3 char(2)=default,
...
)
as
--执行的sql语句
go// 2. 在 C#中 调用存储过程
//1.引入命名空间
using System.Data;
using System.Data.SqlClient; //2.创建 数据库 连接字符串
// 使用 sa 身份登录
string connStr = @"Data Source=服务器名; Initial Catalog=数据库名; User ID=sa; Pwd=数据库_密码";
// 使用 windows身份 登录
string connStr = @"Data Source=服务器名; Initial Catalog=数据库名; Integrated Security=true";
//3.创建 sql 命令
string sql = "存储过程名称";
注:调用存储过程时,sql语句是所调用的存储过程的名称,否则就是你要执行的sql语句。
存储过程名称 前后不能有空格,否则报错:不能找到该存储过程。 //4.根据 数据库连接字符串 创建 数据库连接对象
SqlConnection conn = new SqlConnection(connStr); //5.根据 数据库连接字符串和连接对象 创建 执行对象
SqlCommand cmd = new SqlCommand(sql,conn); //6.设置 执行sql命令 的类型为:存储过程
cmd.CommandType = CommandType.StoredProcedure; //7.为 带参数的存储过程 添加参数( 如果没有参数,可以省略 )
SqlParameter[] paras = new SqlParameter[]
{
// 输入参数
new SqlParameter("@参数名",value),
// 输出参数
new SqlParameter("@参数名",SqlDbType.数据类型,数据长度)
};
// 设置 第二个参数的方向:输出
paras[1].Direction = ParameterDirection.Output;
// 给 cmd(执行对象) 添加参数
cmd.Parameters.AddRange(para); //Add() 添加单个参数,AddRange() 添加多个参数 //8.打开 数据库
conn.Open(); //9.执行 sql命令
// 情况一:返回 存储过程中 *执行所有增、删、改语句* 所受影响的行数
int count = cmd.ExecuteNonQuery(); // 情况二:返回 存储过程中 *执行第一条查询语句* 所返回的结果集
SqlDataReader dr = cmd.ExecuteReader(); // 情况三:返回 存储过程中 *执行第一条查询语句* 所返回的第一行第一列的值
object obj = cmd.ExecuteScalar(); 注:上面的 3个方法都会 把存储过程执行完毕,只是返回的结果不同而已。
//10.获取 输出参数的值( 如果没有输出参数,可以省略 )
object obj = paras[1].Value;
// 通过上面声明的SqlParameter[]元素的Value获取
//或者
// 通过cmd.Parameters[1].Value获取 //11.关闭数据库连接资源
注:可以使用 using 实现自动关闭。 注意:实际过程中,还需进行 异常捕获等。如:SQLException
数据库: a、存储过程的参数 可以不用括号括起来。
b、数据类型发生自动类型转换时,会向范围大的那个值的类型进行转换,需注意发生转换异常
如:select '123a'+1 这里1的int类型,范围比'123a'的字符型大,所以系统会把'123a'
转换成int类型,但是'123a'无法转换成int,系统报错。