C#中是不允许执行带GO的sql 语句的, 如何做呢?

思路就是将带GO的sql语句转化为分段执行, 但在同一事务内执行。

扩展方法是个很不错的主意, 但是尽量不要影响原来的cmd的一些东东, 如 connection, 故只借用原来的connectionstring和sql , 而 connection 是重新建立的。

1. 预备数据:

--删除表
IF( OBJECT_ID('test') IS NOT NULL )
BEGIN
DROP TABLE test
END
GO
--创建表
CREATE TABLE test(
id INT IDENTITY(1,1),
[name] VARCHAR(MAX),
flag INT
)
GO
--加测试数据
INSERT INTO test VALUES ('init',0)
--
SELECT * FROM test
--id name flag
---- --------- -----
--1 first 0

2. 测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;
using System.Data; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string connectString = "Data Source=leaf-home\\sqlserver2005;Initial Catalog=managecenter2005;Persist Security Info=True;User ID=site_dev;Password=site_devsite_dev";
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
Console.WriteLine("1. 初次能正常执行");
string sql = "update test set [name]='1st',flag=1";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
OutputAllInfo(conn); Console.WriteLine("2. 执行带GO, 注:修改是分两次");
sql = "update test set [name]='2nd';GO;update test set [flag]=2";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQueryWithGo();
OutputAllInfo(conn); Console.WriteLine("3. cmd再次执行");
sql = "update test set [name]='3rd',[flag]=3";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
OutputAllInfo(conn);
} Console.Read();
}//end of Main public static void OutputAllInfo(SqlConnection conn)
{
string sql = "select * from test";
SqlCommand cmd = new SqlCommand(sql,conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt); foreach (DataColumn dc in dt.Columns)
{
Console.Write(dc.ColumnName+"\t");
}
Console.WriteLine();
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["id"].ToString()+"\t"+dr["name"].ToString()+"\t"+dr["flag"].ToString());
}
}
}//end of class public static class ExtMethods
{
/// <summary>
/// 执行带GO的SQL,返回最后一条SQL的受影响行数
/// </summary>
/// <param name="sql"></param>
/// <returns>返回最后一条SQL的受影响行数</returns>
public static int ExecuteNonQueryWithGo(this SqlCommand oldCmd)
{
int result = 0;
string[] arr = System.Text.RegularExpressions.Regex.Split(oldCmd.CommandText, "GO");
using (SqlConnection conn = new SqlConnection(oldCmd.Connection.ConnectionString))
{
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)
{
cmd.CommandText = strsql;
result = cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (System.Data.SqlClient.SqlException E)
{
tx.Rollback();
//return -1;
throw new Exception(E.Message);
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
}
return result;
}
}//end of class
}//end of namespace

C#中 如何执行带GO的sql 语句的更多相关文章

  1. delphi 中如何执行SqlParameter形式的SQL语句

    procedure TForm1.Button1Click(Sender: TObject); begin ADOConnection1.Open('); ADOQuery1.Close; ADOQu ...

  2. JAVA执行带参数的SQL语句

    转自 http://www.cnblogs.com/raymond19840709/archive/2008/05/12/1192948.html

  3. 在Hive中执行DDL之类的SQL语句时遇到的一个问题

    在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...

  4. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  5. 【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中

    执行了save()方法  sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提 ...

  6. Mysql 定位执行效率低的sql 语句

    一.通过MySQL慢查询日志定位执行效率低的SQL语句. MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysq ...

  7. 执行最慢的SQL语句

    ---执行最慢的SQL语句SELECT top 20(total_elapsed_time / execution_count)/1000 N'平均时间ms',total_elapsed_time/1 ...

  8. mybatis 中的稍微复杂些的sql语句

    mybatis 中的稍微复杂些的sql语句: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  9. 通过带参数的Sql语句来实现模糊查询(多条件查询)

    #region 通过带参数的Sql语句来实现模糊查询(多条件查询) StringBuilder sb = new StringBuilder("select * from books&quo ...

随机推荐

  1. 各种oracle参数查询语句

    各种oracle参数查询语句 1.show parameter:--显示各个系统参数配置 2.select * from v$parameter;--显示各个系统参数配置 2.show paramet ...

  2. ApacheBench(ab)使用简介

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  3. centos下mysql 最新版最终成功安装!备份一下几个关键地方

    我本来仅仅是为了搭建简单的LAMP环境,亲自己主动手,却发现有这么多的问题会发生.(by default7#zbphp.com) 非常多地方给的安装Mysql的提示是通过yum一键安装.shell命令 ...

  4. Java获取系统相关信息System.getProperty()

    java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...

  5. C#框架

    从零开始编写自己的C#框架(1)——前言   记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种 ...

  6. php利用SoapClient调用webservices

    原文:php利用SoapClient调用webservices 1.开启soap支持,在php.ini中去除extension=php_soap.dll之前的':' 2.掉用页面 <?php h ...

  7. Ninject.Extensions.

    最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结.首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦.我喜欢前一段时间看EF的CodeFirst的那种 ...

  8. mvc拦截器

    在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器.这里说的是第一种和第三种.其实所谓的ASP.NET MVC拦截器,也没什么神秘的,就是一个普 ...

  9. 让png在ie下正常显示 用到了jquery插件DD_belatedPNG 但是在ie6中这句话 前面添加有效 后面移除无效 IE6 jq removeClass无效

    jQuery(this).addClass("background").siblings().removeClass("background") 导致IE6移除 ...

  10. Apache2.4.x与Apache2.2.x的一些区别

    改用Apache2.4一段时间了,一直没发现它和Apache2.2的有什么区别,一些基本配置都是差不多,直到前几天配置虚拟主机是才发现了一些小小的不同 一直以来我都是在htdocs目录下配置虚拟主机的 ...