Skip to main content
 首页 » 编程设计

C#:如何以编程方式将 SQL 脚本导入数据库

2026年04月16日32xing901022

我是否必须手动解析 SQL 脚本并单独执行每个语句,还是有更好的方法? 我正在寻找一种编程解决方案,我知道有些工具已经能够做到这一点。 如果该解决方案适用于所有数据库系统,而不仅仅是 sqlite,那就太好了。

请您参考如下方法:

我不确定这如何适用于 SqlLite,但我在 SqlServer 中使用了如下代码:

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()操作,然后循环遍历命令数组并一次执行一个。

编辑:

@Mark 下面的评论称“GO”可能作为另一个单词的一部分出现在脚本中,这绝对是一个合理的担忧。我记得当我编写上面的代码时,我搜索了我的脚本以确保“GO”仅作为批处理分隔符出现。另一种方法(没有双关语)是编辑所有脚本,以便“GO”后面始终跟有相同的注释,例如“--SPLIT HERE!”并将分隔符更改为“GO -- SPLIT HERE!”。但是,这需要您编辑脚本。另一个选项是 Regex.Split(),它允许您在 GO 之前检查空格。在我的脚本中,我的批处理分隔符总是独占一行。如果相同的规则适用于您的脚本,则类似以下内容应该有效:

string[] commandTextArray = System.Text.RegularExpressions.Regex.Split(script, "\r\n[\t ]*GO"); 

底线是批处理分隔符需要一定的格式一致性才能准确地拆分脚本。