C#,WINFORM中用代码执行.SQL脚本
每执行一次需要创建一个数据库模型,数据来源是A.SQL文件,读取内容后,经过修改生成一个STRING,这个就等同于A.SQL文件的内容,只是一些关键字被修改了,我要在C#中执行这个String,怎么做?数据库是MYSQL,由于每次执行的内容都会变,所以没办法做成存储过程,想过比较笨的办法,可以再重新生成文件,再执行,但是不知道可以不,如果可以直接执行这个String字符串那就好了。。。期待高手出现!!! --------------------编程问答----------------------------------------编程问答--------------------
//如果文件是多条语句,要readline然后调用这个方法,保证每条string都执行
//读取文件
string sql = 从A.sql来的string;
//在事务中执行
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
try
{
//用sqlcommand 执行这个语句就可以了
//我这里用了sqlHelper类,你可以在网上找到
SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sql);
tran.Commit();
System.Windows.MessageBox.Show("执行成功);
}
catch (Exception ex)
{
tran.Rollback();
System.Windows.MessageBox.Show(ex.Message);
}
finally
{
tran.Dispose();
}
}
--------------------编程问答--------------------
/// <summary>
/// 从sql脚本中获取每一段sql语句(go用来分段)
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private static List<string> GetSqlStrsFromFile(string FilePath)
{
string FileText = File.ReadAllText(FilePath, Encoding.Default);
if (string.IsNullOrEmpty(FileText))
return null;
//读取文件
string[] sqlStrs = File.ReadAllLines(FilePath, Encoding.Default);//FileText.Split('\r','\n');
List<string> alSql = new List<string>();
string commandText = "";
//循环获取每一行的sql语句
for (int i = 0; i < sqlStrs.Length; i++)
{
//如果不是go,则追加到要执行的sql语句中
if (!sqlStrs[i].Trim().Equals("go", StringComparison.OrdinalIgnoreCase))
{
commandText += sqlStrs[i].Trim();
commandText += "\r\n";
//如果是最后一行,则将要执行的sql语句添加到数组中
if (i + 1 == sqlStrs.Length)
alSql.Add(commandText);
}
else
{
if (commandText == "")
continue;
alSql.Add(commandText);
commandText = "";
}
}
return alSql;
}
//执行sql脚本文件
public static void ExcuteSQLFile(string FilePath)
{
List<string> list = GetSqlStrsFromFile(FilePath.ToString());
if (list == null)
return;
foreach (string str in list)
{
try
{
DBHelper.ExecuteNonQuery(str);
}
catch (Exception ex)
{
throw ex;
}
}
}
补充:.NET技术 , C#