在c#中读取一个大的SQL脚本文件

我正在尝试阅读一个大脚本,到目前为止我尝试了两个选项:

选项1:

我们无法在SQL管理工作室中打开大型脚本文件,因为内存空间不足,所以最初我使用sqlcmd在远程主机上执行160 MB的SQL脚本文件,55分钟后,一些行受此错误影响, TCP Provider: An existing connection was forcibly closed by the remote host. , communication link failure. TCP Provider: An existing connection was forcibly closed by the remote host. , communication link failure.

选项2:

现在我正在尝试使用此示例,文件大小为160 MB,包含大量插入语句,但Visual Studio崩溃

码:

 public ActionResult Index() { string scriptDirectory = "e:\\"; string sqlConnectionString = "Integrated Security=SSPI;" + "Persist Security Info=True;Initial Catalog=TestDB;Data Source=localhost\\SQLEXPRESS"; DirectoryInfo di = new DirectoryInfo(scriptDirectory); FileInfo[] rgFiles = di.GetFiles("*.sql"); foreach (FileInfo fi in rgFiles) { FileInfo fileInfo = new FileInfo(fi.FullName); string script = fileInfo.OpenText().ReadToEnd(); // here visual studio crashes SqlConnection connection = new SqlConnection(sqlConnectionString); Server server = new Server(new ServerConnection(connection)); server.ConnectionContext.ExecuteNonQuery(script); } return View(); } 

屏幕截图:

在此处输入图像描述

我建议逐行执行insert语句,可选地包含在事务中:

 public ActionResult Index() { string scriptDirectory = "e:\\"; string sqlConnectionString = "Integrated Security=SSPI;" + "Persist Security Info=True;Initial Catalog=TestDB;Data Source=localhost\\SQLEXPRESS"; using(var connection = new SqlConnection(sqlConnectionString)) { var transaction = connection.BeginTransaction(); using(var command = connection.CreateCommand()) { ProcessFiles(command, scriptDirectory); } transaction.Commit(); } return View(); } private void ProcessFiles(SqlCommand command, string scriptDirectory) { foreach(var file in Directory.GetFiles(scriptDirectory,"*.sql")) { using(var reader = new StreamReader(file)) { while(!reader.EndOfStream) { var line = reader.ReadLine(); if(!line.StartsWith("GO")) { command.CommandText = line; command.ExecuteNonQuery(); } } } } } 

请记住,这会对数据库的日志文件造成一些压力。