C# 读取c语言中的大型SQL脚本文件#
我正在尝试阅读大型脚本,迄今为止,我尝试了两种选择: 选项1: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";
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
语句,我已经做了更改,谢谢。