/// <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);
}
}
}
C#读取.sql文件并执行文件中的sql!哪位可以给注释一下,每一条语句的用法和含义的啊?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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);//抛出异常,这里缺少回滚的操作 } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥15 永磁直线电机的电流环pi调不出来
- ¥15 用stata实现聚类的代码
- ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
- ¥20 docker里部署springboot项目,访问不到扬声器
- ¥15 netty整合springboot之后自动重连失效
- ¥15 悬赏!微信开发者工具报错,求帮改
- ¥20 wireshark抓不到vlan
- ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
- ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
- ¥15 stata安慰剂检验作图但是真实值不出现在图上