C# 如何运行具有大量行的SQL文件?

C# 如何运行具有大量行的SQL文件?,c#,sql-server-2008,C#,Sql Server 2008,我有一个SQL文件(filenameScript),包含超过10k行代码。SQL的每个块都以GO开头,以GO结尾。在从C#执行文件时,我得到了异常near GO语句。但是,当我在SQL server中运行同一个文件时,它工作正常 con.ConnectionString = sqlconn; FileInfo file = new FileInfo(filenameScript); string script = file.OpenText().ReadToEnd(); SqlCommand c

我有一个SQL文件(filenameScript),包含超过10k行代码。SQL的每个块都以GO开头,以GO结尾。在从C#执行文件时,我得到了异常near GO语句。但是,当我在SQL server中运行同一个文件时,它工作正常

con.ConnectionString = sqlconn;
FileInfo file = new FileInfo(filenameScript);
string script = file.OpenText().ReadToEnd();
SqlCommand command = new SqlCommand(script, con);
con.Open();
command.ExecuteNonQuery();
Close();
我认为
executenonquery
无法处理如此多的
\n
\r
\t
,因为读取的文件存储在一行中,其中包含许多
\n
\r
。 还有其他方法可以做到这一点吗?
提前感谢。

不,问题不在于文件的长度,也不在于是否存在
\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()
此外,您可以将其包装在
事务中
,以确保所有批处理都以原子方式执行


在这个SO问题中还提供了另一种选择:

异常消息会很好。这可能不起作用的原因有很多显示错误**字符串的最佳重载方法匹配。
string.Split(params char[])
有一些无效参数**这是一个非常基本的错误,Veer。但是
string.Split
确实有一个非常糟糕的界面。我会用
Regex.Split(脚本文件,“GO”,RegexOptions.IgnoreCase)
代替它。@VeerB.Singh-我糟糕的、可怕的字符串拆分接口。我更新了它。@QuickJoeSmith Sql脚本被弄乱了。使用此选项,评论也会变得混乱。是否有任何方法可以在一次尝试中直接运行多个批处理,包括GO字。@Jamiec:这会使我的Visual Studio崩溃。
错误1内部编译器错误(地址5A7D9D68处的0xc0000005):可能的罪魁祸首是“绑定”。编译器中发生内部错误。要解决此问题,请尝试在下面列出的位置附近简化或更改程序。列表顶部的位置更靠近发生内部错误的点。可以使用/errorreport选项向Microsoft报告此类错误。