简单的脚本批量发布(带事务)程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            string connString = @"Data Source=(local)\sqlserver2014;Initial Catalog=tempdb;Integrated Security=True";
            //正确SQL
            string sql_1 =
@"IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(id INT IDENTITY(1,1) PRIMARY KEY)
GO
ALTER TABLE t ADD c1 INT
go
INSERT INTO t(c1) VALUES(1)
";
            //有错误的SQL
            string sql_2 =
@"INSERT INTO t(c1) VALUES(2)
GO
if object_id('proc_test') is not null drop proc proc_test
go
CREATE PROC Proc_TEST
AS
Begin
    set nocount on
    select 1
end
go
123 -- 注:此处有误
";
            string errMsg = string.Empty;
            bool r1 = ExecuteNonQueryWithConnAndGO(connString, sql_1, ref errMsg);
            Console.WriteLine("SQL1 结果:{0}, 错误信息:{1}", r1 ? "成功":"失败", string.IsNullOrEmpty(errMsg)?"无":errMsg);

            errMsg = string.Empty;
            bool r2 = ExecuteNonQueryWithConnAndGO(connString, sql_2, ref errMsg);
            Console.WriteLine("SQL2 结果:{0}, 错误信息:{1}", r2 ? "成功" : "失败", string.IsNullOrEmpty(errMsg) ? "无" : errMsg);

            //注:第2个SQL有问题,所以第2个SQL全部回滚了,只有第一个SQL的记录
            Print(connString, "select * from t");

            Console.Read();
        }

        #region [ 执行带Go语句 ]
        /// <summary>  
        /// 执行带"GO"的SQL,返回最后一条SQL的受影响行数  
        /// </summary>  
        /// <param name="connString">连接串</param>  
        /// <param name="sql">sql语句</param>  
        /// <returns>是否成功</returns>
        public static bool ExecuteNonQueryWithConnAndGO(string connString, string sql, ref string errMsg)
        {
            bool result = true;
            string[] arr = System.Text.RegularExpressions.Regex.Split(sql, @"\bGO\b", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < arr.Length; n++)
                    {
                        string strsql = arr[n];
                        if (strsql.Trim().Length > 1 && strsql.Trim().Replace(";", "") != "")
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                }
                catch (System.Data.SqlClient.SqlException ex)
                {
                    tx.Rollback();
                    result = false;
                    errMsg = ex.Message;
                }
            }
            return result;
        }
        #endregion

        public static void Print(string connString, string sql) 
        {
            Console.WriteLine("\r\n------- 输出信息: {0} --------", sql);

            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection(connString)) 
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dt);
            }

            foreach (DataRow dr in dt.Rows) 
            {
                foreach (DataColumn dc in dt.Columns) 
                {
                    Console.Write("{0}: {1}\t",dc.ColumnName,dr[dc.ColumnName].ToString());
                }
                Console.WriteLine();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值