我正在尝试阅读一个大型脚本,到目前为止,我尝试了两个选项:
选项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();
}
屏幕截图:
答案 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();
}
}
}
}
}
请记住,这会对数据库的日志文件造成一些压力。