********************************
  使用 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,系统报错。