// 2015/07/04 // 访问存储过程 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace Ado.netstart_1 { class Program { static void Main(string[] args) { // 特殊的字符串,数据库连接串 // 第一种 string connectionString = "server=.;database=BookSample;uid=LJK;pwd=123456;"; // 第二种 // windows身份验证 // 当使用windows身份验证的时候,windows用户就是运行程序的用户 // string connectionString = "server=.;integrated security=true;database=BookSample"; // 用来访问数据库的类 SqlConnection connection = new SqlConnection(connectionString); try { // 与数据库建立连接 connection.Open(); Console.WriteLine("已经建立连接"); // sql就是一个字符串 // 存储过程在数据库中有一个名字:execute 名字 // 现在的sql命令只需要存储过程的名字,不需要execute,也不需要参数 string sql = "output"; // SqlCommand 表示发送数据库执行SQL命令 // 现在sql已经不是标准的sql命令,而是一个存储过程 SqlCommand command = new SqlCommand(sql, connection); // 通知数据库现在执行的是存储过程 // 如果没有设定那么默认为标准的存储过程 command.CommandType = CommandType.StoredProcedure; // 提供存储过程需要的参数 // 表示参数的类SqlParameter SqlParameter pEnd = new SqlParameter("@id", System.Data.SqlDbType.Int); pEnd.Value = 2; //现在存储过程有多了一个传出参数 SqlParameter result = new SqlParameter("@stuname",System.Data.SqlDbType.VarChar); //默认情况下,Direction的值是传入参数 //现在是传出参数 result.Direction = ParameterDirection.Output; // 在执行存储过程的时候,将参数传递给存储过程 // 在存储过程之前,必须将需要的参数依次准备好 command.Parameters.Add(pEnd); command.Parameters.Add(result); // 设置实际的参数值 // 将命令发送到数据库执行 // sql语句可分为:查询语句和非查询语句 // 默认工作在自动事务之下 // 如果工作在手动事务之下 // begin transaction // rollback / commit // 在执行sql dml之前,启动事务 SqlTransaction trans = connection.BeginTransaction();//事务对象 // 设定命令所属的事务管理 command.Transaction = trans; //执行该存储过程对数据库中的行数没有影响 // int effectCount = command.ExecuteNonQuery(); // Console.WriteLine("{0} 行受影响", effectCount); //对于传出参数来说,必须在执行存储过程之后才能取得传出的值 //因为数据库中传出的值,可能是各种类型,所以,value 属性的类型是Object String presult = (String)result.Value; Console.WriteLine("pResult: {0}",presult); Console.Write("命令已经执行,事务还没有提交,你确定提交吗?Y/N"); string line = Console.ReadLine(); if (line.Substring(0, 1).ToUpper() == "Y") { trans.Commit(); Console.WriteLine("事务已经提交"); } else { trans.Rollback(); Console.WriteLine("事务已经回滚"); } } catch (SqlException exception) { Console.WriteLine(exception.Message); } finally { // 或者断开与数据库的连接 connection.Dispose(); // connection.Close(); Console.WriteLine("已经断开连接"); } Console.ReadKey(); } } }