有些时候我们需要在程序中编写读取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是什么,自己可以百度看看,了解了解它是多么的强大。