zj199719 2021-11-16 15:51 采纳率: 58.3%
浏览 36
已结题

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);
            }
        }


    }
  • 写回答

1条回答 默认 最新

  • 於黾 2021-11-16 16:07
    关注
    
     
     /// <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);//抛出异常,这里缺少回滚的操作
                }
            }
     
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 创建了问题 11月16日

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上