C#读取.sql文件并执行文件中的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 + "DATABASE.sql");   
                string path = System.IO.Path.Combine(targetdir, "DATABASE.sql");                     
                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);
            }
        }


    }

 
 /// <summary>
        /// 利用数组获取sql脚本文件中的sql语句
        /// </summary>
        /// <param name="targetdir">路径</param>
        /// <param name="dbname">数据库名</param>
        /// <returns></returns>
        public static ArrayList Getarraylist(string targetdir, string dbname) //静态函数,输入两个字符串路径和数据库名,返回一个ArrayList里面是sql语句
        {
            ArrayList sqllist = new ArrayList();//新建一个ArrayList待用,这里用List<string>会更好,避免用弱类型
            try
            {
                System.IO.FileInfo FileInfo = new System.IO.FileInfo(targetdir + "DATABASE.sql"); //文件信息对象 
                string path = System.IO.Path.Combine(targetdir, "DATABASE.sql"); //合并目录,比直接字符串相加要保险,否则容易多出斜杠造成非法路径                    
                string varLine = "";                                                             
                StreamReader sr = new StreamReader(path,System.Text.Encoding.Default); //数据流读取对象              
                while (sr.Peek() > -1)//判断是否读到文件的结尾
                {
                    varLine = sr.ReadLine();//按字符串格式读取一行
                    varLine = varLine.Replace("[kms]", "[" + dbname + "]");//替换字符串,将[kms]括号里的部分替换成数据库名称
                    if (varLine == "")//如果读出来是空行跳过,继续读下一行。这应该在替换之前写的
                    {
                        continue;
                    }
                    if (varLine != "GO" && varLine != "go" && varLine.Substring(0, 1) != "/")//判断如果不是GO或者/
                    {
                        commandText += varLine;//追加进一个字符串commandText里面
                        commandText += "\r\n";
                    }
                    else //如果是GO或者/
                    {
                        sqllist.Add(commandText); //把拼接好的commandText放到sqllist里
                        commandText = "";//清空,以便继续往里拼接新的sql语句
                    }
                }
                //string line = sr.ReadToEnd();
                sr.Close();//都结束了close掉,但是这种用法不好,如果报错进入catch则close不会执行,造成文件打开不关闭,应该使用using关键字
                //line = line.Replace("[kms]", "[" + dbname + "]");
                return sqllist;//返回sqllist
            }
            catch (Exception e)
            {
                throw new InstallException(e.Message);//如果报错了则抛出错误,多此一举,这加try加了个寂寞,要不想处理干脆别加try
            }
        }
        //将获取到的数据传入这个函数就可以执行sql语句
        public static void ExcuteSql(SqlConnection connectstring, ArrayList sql)//传入数据库连接对象和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;//sql命令赋值
                        cmd.ExecuteNonQuery();//sql指令执行
                    }
                }
                varTrans.Commit();//如果全部执行成功不报错则提交
            }
            catch (Exception e)
            {
                throw new InstallException(e.Message);//抛出异常,这里缺少回滚的操作
            }
        }
 
    }