我用SQLCOMMAND执行这条语句
SELECT 12;
GO 
会出现错误,那我要执行上面的SQL语句怎么执行?语句不能改。谁用NET类库或自定义类运行了上面的SQL,
300分(过几天会+分或者开贴点名)全部给没人能回答的话,100分全给

解决方案 »

  1.   

    例如:using System;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;namespace Skyiv
    {
      class SqlObject
      {
        protected SqlConnection conn;    // 构造函数,参数为连接串。
        protected SqlObject(string strConn)
        {
          conn = new SqlConnection(strConn);
        }    // 执行SQL,并返回查询所返回的结果集中第一行的第一列。
        public object ScalarQuery(string sql, params SqlParameter [] paras)
        {
          sql = Regex.Replace(sql, @"(?i)\bgo\b", "");
          SqlCommand cmd = new SqlCommand(sql, conn);
          try
          {
            cmd.Connection.Open();
            foreach (SqlParameter para in paras)
            {
              cmd.Parameters.Add(para);
            }
            return cmd.ExecuteScalar();
          }
          finally
          {
            cmd.Connection.Close();
          }
        }
      }
    }
      

  2.   

    测试:using System;class Test
    {
      static void Main()
      {
        string conn = "server=(local);Trusted_Connection=True";
        string sql  = "SELECT 12;\r\nGO";
        int i = (int)new Skyiv.SqlObject(conn).ScalarQuery(sql);
        Console.WriteLine(i);  // 输出 12
      }
    }
      

  3.   

    那SQL语句包含GO或者注释中包含GO,那你是会出现错误?
      

  4.   


    1. 注释中包含的GO去掉是不会出现错误的。
    2. 我去掉的是 \bgo\b,其中\b表示单词边界,也就是说GO前后都是非单词字符才会被去掉。
      

  5.   

    改成下面这样更好:      sql = Regex.Replace(sql, @"(?mi)^\s*go\s*$", "");这样是把单独一行的 GO 去掉(允许GO前后有空格字符),
    这样就不会把 SQL 语句中的列名 [GO] 之类的误去掉了。
      

  6.   

        string sql  = "SELECT 12 as [GO];\r\n  GO";即使这样写查询语句,第一个 GO 不会被去掉,第二个 GO 包括前面的空格都会被去掉。
    在查询分析器中,也是要求 GO 必须在单独的一行,否则就出错,所以只要去掉单独一行的 GO 就行了。
      

  7.   

    只用正则好难吧,SELECT '12
    GO
    12';
    GO--SELECT '12
    --GO
    --12';
    --GO 
      

  8.   

    一个正则好难哦,而且我也想像查询分析器那样可以执行任何SQL语句
      

  9.   

    ...有吗???
     查询分析器还不一样的先判断该数据库,然后读取相应的
    内容..虽然还没明白你那意思..
      在2000数据库的MASTER里面
     你的语句完全没有任何问题..
     我想数据库里面没问题,你传递进去的值只要没问题就OK的
     ..
      

  10.   


    我是要用.NET来运行上面的sql
      

  11.   


    那就用两个正则:    // 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
        sql = Regex.Replace(sql, @"(?m)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
        // 第二步:去掉所有不在单引号中的单独一行的 GO。
        sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");LZ看看还有什么特殊情况没考虑到?
      

  12.   

    更正一下,第一个正则的 (?m) 改为 (?ms),
    因为 /\*.?\*/ 要能匹配多行注释,
    这个 . 需要可以匹配换行符,所以加上 (?s)。
          // 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
          sql = Regex.Replace(sql, @"(?ms)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
          // 第二步:去掉所有不在单引号中的单独一行的 GO。
          sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");
      

  13.   


    呵呵,拆分sql执行总是不太好吧?
    begin transaction ; 
    select 1;
    go
    select 2;
    go
    commit transaction;
      

  14.   

    修改后的程序:using System;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;namespace Skyiv
    {
      public class SqlObject
      {
        protected SqlConnection conn;    // 构造函数,参数为连接串。
        public SqlObject(string strConn)
        {
          conn = new SqlConnection(strConn);
        }    // 执行SQL,并返回查询所返回的结果集中第一行的第一列。
        public object ScalarQuery(string sql, params SqlParameter [] paras)
        {
          // 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
          sql = Regex.Replace(sql, @"(?ms)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
          // 第二步:去掉所有不在单引号中的单独一行的 GO。
          sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");
          SqlCommand cmd = new SqlCommand(sql, conn);
          try
          {
            cmd.Connection.Open();
            foreach (SqlParameter para in paras)
            {
              cmd.Parameters.Add(para);
            }
            return cmd.ExecuteScalar();
          }
          finally
          {
            cmd.Connection.Close();
          }
        }
      }
    }测试:class Test
    {
      static void Main()
      {
        string conn = @"server=(local)\SQLEXPRESS;Trusted_Connection=True";
        string sql  = @"/*e'
    */SELECT '12''yy
    --GO/*
    12';
    GO --r";
        string s = (string)new Skyiv.SqlObject(conn).ScalarQuery(sql);
        Console.WriteLine(s);
      }
    }/* 程序输出:
    12'yy
    --GO/*
    12
    */
      

  15.   


    所以想,.NET有没有执行批处理的类或方法?
    或这自己如何实现一个自定义的类。
      

  16.   


    .NET恐怕没有现成的类。自己定义的类,我想到的最简单的就是如上面所说的“去掉所有不在单引号中的单独一行的 GO”。或者可以考虑调用一个“微型的查询分析器”去执行SQL语句,并且要求能返回查询结果给调用它的程序。
      

  17.   

    sql = Regex.Replace(sql, @"(?mi)^\s*go\s*$", "");
    不知对不对,顺便帮你顶上去
      

  18.   

    对的,GO不是可识别的T-SQL语句,在C#中要把GO去掉,不然会报错!
    参考下这个
    http://publish.it168.com/2005/0803/20050803071701.shtml
      

  19.   

    在用C#中调用ADO执行批量SQL语句的时候,会出现无法识别GO语句的错误。这个时候,我们以GO语句为分割点,把整个批量语句分割成N块独立的SQL语句代码块(不包含GO语句),然后再顺序执行每一块代码。
    编程实现方法如下:     System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand();
         sqlCommand.Connection = this.Connection;//这里的 this.Connection 替换成你的SQL数据库连接     System.Collections.ArrayList al = new System.Collections.ArrayList();
         System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex( @"^(\s*)go(\s*)$", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline | System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.ExplicitCapture );
         al.AddRange( reg.Split(SQLString) );//SQLString是你的原始SQL批量语句,在这里通过上面的正则表达式进行分割,然后添加到集合(al实例)中。
         foreach( string tmp in al )//循环执行每一个SQL代码块
         {
          sqlCommand.CommandText = tmp.Trim();
          if( sqlCommand.CommandText.Length > 0 )
          {
           sqlCommand.ExecuteNonQuery();
          }
         }
      

  20.   


    呵呵,拆分sql执行总是不太好吧? begin transaction ; 
    select 1;
    go
    select 2;
    go
    commit transaction;
      

  21.   

    好象是用C#调用osql.exe(好象是这么写的)就可以,你试试!我当时做数据库脚本执行的时候也遇到过这样的问题!
      

  22.   

    其实我就是想用C#实现,可以想查询分析器那样执行任何SQL语句的组合,就是查询分析器能执行的,c#中也要能执行
    而且结果一样,什么事务啊,会话信息啊,结果统统一样,有没人弄过?