我有一个拥有超过10k行代码的SQL文件(filenameScript)。每个SQL块都以GO开头,以GO结束。在从C#执行文件时,我在GO语句附近遇到异常。但是当我在SQL服务器上运行相同的文件时,它运行正常。
con.ConnectionString = sqlconn;
FileInfo file = new FileInfo(filenameScript);
string script = file.OpenText().ReadToEnd();
SqlCommand command = new SqlCommand(script, con);
con.Open();
command.ExecuteNonQuery();
Close();
我认为ExecuteNonQuerry
无法处理这么多\n
,\r
和\t
因为文件读取存储在一行中有很多\n
}和\r
。
有没有其他方法可以做同样的事情?
提前谢谢。
答案 0 :(得分:3)
不,问题不是文件的长度,也不存在\r
和/或\n
个字符。这是因为使用该方法执行SQL只能运行一个批处理,而具有GO
语句的脚本会导致多个批处理。
一种可能性是将关键字GO
上的文本拆分并执行每个单独的部分:
con.ConnectionString = sqlconn;
var commands = File.ReadAllText(filenameScript).Split(new []{"GO"},StringSplitOption.RemoveEmptyEntries);
con.Open();
foreach(var batch in commands)
{
SqlCommand command = new SqlCommand(batch, con);
command.ExecuteNonQuery();
}
con.Close()
此外,您可以将其包装在Transaction
中以确保所有批次都以原子方式执行。
此SO问题还提供了另一种选择:How do I execute a large SQL script (with GO commands) from c#