在c#

时间:2015-12-08 07:04:46

标签: c# sql-server

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

选项1:

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

影响

选项2:

现在我正在尝试使用this示例,文件大小为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();
}

屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:0)

我建议逐行执行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();
                }
            }
        }
    }        
}

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