c#访问存储过程

// 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();
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/4620932.html