我是否必须手动解析 SQL 脚本并单独执行每个语句,还是有更好的方法?
我正在寻找一种编程解决方案,我知道有些工具已经能够做到这一点。
如果该解决方案适用于所有数据库系统,而不仅仅是 sqlite,那就太好了。
我不确定这如何适用于 Sqlite,但我在 Sql Server 中使用了如下代码:
protected virtual void ExecuteScript(SqlConnection connection, string script)
{
string[] commandTextArray = script.Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries); // See EDIT below!
connection.Open();
foreach (string commandText in commandTextArray)
{
if (commandText.Trim() == string.Empty) continue;
SqlCommand command = new SqlCommand(commandText, connection);
command.ExecuteNonQuery();
}
connection.Close();
}
(警告:我必须稍微修改我的原始代码,所以这是未经测试的代码。)
我发现通过ADO.NET运行脚本时“GO”这个词是一个问题,因此代码以“GO”为分隔符对整个脚本进行Split()操作,然后循环遍历命令数组并执行它们一次一个。
EDIT:
@Mark 下面的评论称“GO”可能作为另一个单词的一部分出现在脚本中,这绝对是一个合理的担忧。我记得当我编写上面的代码时,我搜索了我的脚本以确保“GO”仅作为批次分隔符出现。另一种方法(没有双关语)是编辑所有脚本,以便“GO”后面始终跟有相同的注释,例如“-- SPLIT HERE!”并将分隔符更改为“GO -- SPLIT HERE!”。但是,这需要您编辑脚本。另一个选项是 Regex.Split(),它允许您在 GO 之前检查空格。在我的脚本中,我的批次分隔符总是独占一行。如果相同的规则适用于您的脚本,则类似以下内容应该有效:
string[] commandTextArray = System.Text.RegularExpressions.Regex.Split(script, "\r\n[\t ]*GO");
最重要的是,批处理分隔符需要一定的格式一致性才能准确地拆分脚本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)