扩大
缩小

C#调用存储过程

用命令对象调用存储过程,就是定义存储过程的名字,给过程的每一个参数添加参数定义,然后再用SqlCommand命令执行。

下面实例主要以数据库Region表中插入更新的存储过程。

首先给项目添加一个资源文件命名为Strings,在添加存储过程语句:

<data name="CreateSprocs" xml:space="preserve">
    <value>IF OBJECT_ID('RegionInsert') IS NULL
EXEC ('
--
-- Procedure which inserts a region record and returns the key
--
CREATE PROCEDURE RegionInsert(@RegionDescription NCHAR(50),
                              @RegionID INTEGER OUTPUT)AS
  SET NOCOUNT OFF;

  SELECT @RegionID = MAX ( RegionID ) + 1
                       FROM Region ;
     
  INSERT INTO Region(RegionID, RegionDescription)
    VALUES(@RegionID, @RegionDescription);')

IF OBJECT_ID('RegionUpdate') IS NULL
EXEC ('
--
-- Procedure to update the description of a region
--
CREATE PROCEDURE RegionUpdate(@RegionID INTEGER,
                              @RegionDescription NCHAR(50))AS
  SET NOCOUNT OFF;
  
  UPDATE Region
    SET RegionDescription = @RegionDescription
    WHERE RegionID = @RegionID;');</value>
  </data>

  在App.config文件里面配置数据库连接语句:

<connectionStrings>
    <clear/>
    <add name="MyDBPractice" connectionString="server=(local);integrated security=SSPI;database=MyDBPractice;" providerName="System.Data.SqlClient"/>
  </connectionStrings>

  添加类DBConnection用于创建工厂:

 public class DBConnection
    {
        public static DbConnection GetDBConnection(string name)
        {
            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[name];
            DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName);
            DbConnection conn = factory.CreateConnection();
            conn.ConnectionString = settings.ConnectionString;
            return conn;
        }
    }

  在Program.cs类中添加如下代码:

 class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (SqlConnection conn = (SqlConnection)DBConnection.GetDBConnection("MyDBPractice"))
                {
                    conn.Open();
                    InitDBData(conn);//ensure the procedure exist
                    SqlCommand updateCommand = GenerateUpdateCommand(conn);
                    SqlCommand insertCommand = GenerateInsertCommand(conn);
                    DumpRegion(conn, "check the result begin:");
                    insertCommand.Parameters["@RegionDescription"].Value = "South West";
                    insertCommand.ExecuteNonQuery();
                    int newRegionID = (int)insertCommand.Parameters["@RegionID"].Value;
                    updateCommand.Parameters["@RegionDescription"].Value = "England";
                    updateCommand.Parameters["@RegionID"].Value = newRegionID;
                    updateCommand.ExecuteNonQuery();
                }
            }
            catch (SqlException se)
            {
                Console.WriteLine(se.Errors);
            }
        }

        /// <summary>
        /// check the procedure
        /// </summary>
        /// <param name="conn"></param>
        private static void InitDBData(SqlConnection conn)
        {
            SqlCommand cmd = new SqlCommand(Strings.CreateSprocess, conn);
            cmd.ExecuteNonQuery();
        }

        /// <summary>
        /// create a command that will update a region record
        /// </summary>
        /// <param name="conn">database connection</param>
        /// <returns>a command</returns>
        private static SqlCommand GenerateUpdateCommand(SqlConnection conn)
        {
            SqlCommand sCommand = new SqlCommand("RegionUpdate", conn);
            sCommand.CommandType = CommandType.StoredProcedure;
            sCommand.Parameters.Add(new SqlParameter("@RegionID",SqlDbType.Int,0,"RegionID"));
            sCommand.Parameters.Add(new SqlParameter("@RegionDescription", SqlDbType.NChar, 50, "RegionDescription"));
            sCommand.UpdatedRowSource = UpdateRowSource.None;//do not apply the result to dataset
            return sCommand;
        }

        private static SqlCommand GenerateInsertCommand(SqlConnection conn)
        {
            SqlCommand sCommand = new SqlCommand("RegionInsert", conn);
            sCommand.CommandType = CommandType.StoredProcedure;
            sCommand.Parameters.Add(new SqlParameter("@RegionID", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, 
                "RegionID",DataRowVersion.Default,null));
            sCommand.Parameters.Add(new SqlParameter("@RegionDescription", SqlDbType.NChar, 50, "RegionDescription"));
            return sCommand;
        }

        private static void DumpRegion(SqlConnection conn, string message)
        {
            SqlCommand sCommand = new SqlCommand("select t.* from Region", conn);
            SqlDataReader sqlReader = sCommand.ExecuteReader();
            Console.WriteLine(message);
            do
            {
                sqlReader.Read();
                Console.WriteLine("{0, -20},{1,-40}", sqlReader[0], sqlReader[1]);
            } while (sqlReader.Read());
        }
    }

  

 

posted @ 2016-05-17 01:16  Simen.Net  阅读(468)  评论(0编辑  收藏  举报