Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取c语言中的大型SQL脚本文件#_C#_Sql Server - Fatal编程技术网

C# 读取c语言中的大型SQL脚本文件#

C# 读取c语言中的大型SQL脚本文件#,c#,sql-server,C#,Sql Server,我正在尝试阅读大型脚本,迄今为止,我尝试了两种选择: 选项1: public ActionResult Index() { string scriptDirectory = "e:\\"; string sqlConnectionString = "Integrated Security=SSPI;" + "Persist Security Info=True;Initial Catalog=TestDB;Data Source=localhost\\SQLEXPRESS";

我正在尝试阅读大型脚本,迄今为止,我尝试了两种选择:

选项1:

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();
}
由于内存空间不足,我们无法在SQL management studio中打开大型脚本文件,因此最初我使用
sqlcmd
在远程主机上执行160 mb的SQL脚本文件,55分钟后,一些行受到此错误的影响,
TCP Provider:远程主机强制关闭了现有连接,通信链路故障。

选项2:

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();
}
现在我尝试使用这个示例,文件大小是160MB,有很多insert语句,但是VisualStudio崩溃了

代码:

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();
}
屏幕截图:

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();
                }
            }
        }
    }        
}

请记住,这会给数据库的日志文件带来一些压力。

您的脚本是否包含
GO
分隔符?或者只有
插入…
行?为什么Visual Studio要读取该文件?不清楚为什么要在VisualStudio可执行文件中执行代码。(另外,请格式化您的代码以使其更可读。)@Dennis,是的,它包含
GO
分隔符,因为脚本文件是使用Sql management studio中的生成脚本向导生成的。如果只有
INSERT
s和
GO
s,则手动解析此文件相当容易。只需逐行读取文件,跳过
GO
语句,然后按照
SqlCommand
@Jon Skeet执行一个
INSERT
语句,我已经做了更改,谢谢。