C#读取.sql文件并执行文件中的sql

 有些时候我们需要在程序中编写读取sql脚本文件并执行这些sql语句,但是我们在有些时候会遇到读出来的sql语句不能执行,其实不能执行并不是你的sql脚本文件有错误,而是去执行sql语句的时候,而是C#代码里面执行sql语句的代码对sql里面的一些标志字符不识别罢了,下面有两种方法可以实现读取sql文件并执行:

  第一种方法是将sql脚本文件中的sql语句全部读取出来,然后使用C#代码去执行sql语句,但是这种方法的缺陷是:不能有Go标识符,还有不能执行创建视图的语句,如果有上述语句C#代码执行sql语句的时候就会出错,切记以上两点,废话不多说上代码:

 /// <summary>
        /// 利用数组获取sql脚本文件中的sql语句
        /// </summary>
        /// <param name="targetdir">路劲</param>
        /// <param name="dbname">数据库名</param>
        /// <returns></returns>
       public static ArrayList Getarraylist(string targetdir, string dbname)
       {
           ArrayList sqllist = new ArrayList();
           try
           {
               System.IO.FileInfo FileInfo = new System.IO.FileInfo(targetdir + "kmsnew.sql");
               string path = Path.Combine(targetdir, "kmsnew.sql");
               string commandText = "";
               string varLine = "";
               StreamReader sr = new StreamReader(path, System.Text.Encoding.Default);
               while (sr.Peek() > -1)
               {
                   varLine = sr.ReadLine();
                   varLine=varLine.Replace("[kms]","["+dbname+"]");
                   if (varLine == "")
                   {
                       continue;
                   }
                   if (varLine != "GO" && varLine != "go"&&varLine.Substring(0,1)!="/")
                   {                      
                       commandText += varLine;
                       commandText += "\r\n";
                   }
                   else
                   {
                       sqllist.Add(commandText);
                       commandText = "";
                   }
               }
               //string line = sr.ReadToEnd();
               sr.Close();
               //line = line.Replace("[kms]", "[" + dbname + "]");
               return sqllist;
           }
           catch (Exception e)
           {
               throw new InstallException(e.Message);
           }  
       }

//将获取到的数据传入这个函数就可以执行sql语句

public static void ExcuteSql(SqlConnection connectstring,Arraylist sql) {
           try
           {
               SqlTransaction varTrans = connectstring.BeginTransaction();
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = connectstring;
               cmd.Transaction = varTrans;
               foreach(string sqlstring in sql)
               {
                   if (sqlstring != null)
                  {
                       cmd.CommandText = sqlstring;
                       cmd.ExecuteNonQuery();
                   }
               }
               varTrans.Commit();
               
           }
           catch (Exception e)
           {
               throw new InstallException(e.Message);
           }
       }

方法二:本人建议使用方法二,因为方法二没有方法一那么多限制条件,不论是什么sql语句,只要能在sqlserver中执行的语句,它全部都能执行,代码如下:

///<summary>
       ///利用osql实现执行sql脚本文件
        /// </summary>
        //利用osql实现执行sql脚本文件
       public static void excutesqlfile(string user,string pwd,string databasename,string targetdir) {
           System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
           sqlProcess.StartInfo.FileName = "osql.exe ";
           sqlProcess.StartInfo.Arguments = " -U "+数据库用户名+" -P "+数据库密码+" -d "+数据库名称+" -i "+文件路劲+"kmssql.sql";
           sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
           sqlProcess.Start();
           sqlProcess.WaitForExit();//程序安装过程中执行
           sqlProcess.Close();
       }

如果在上面代码中有人不知道osql是什么,自己可以百度看看,了解了解它是多么的强大。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值