如何通过ADO.NET运行.sql脚本文件?

时间:2009-07-27 21:42:59

标签: asp.net sql ado.net

我想通过ADO.NET使用我的ASP.NET网站运行我的.sql脚本文件。怎么可能不起作用?

当我尝试

'dbScript is a string and contains contents of the .sql file'
Dim cmd As New SqlCommand(dbScript, con)
Try
    con.Open()
    cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
    con.Close()
    cmd.Dispose()
End Try

在脚本中执行GO语句时出现异常。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:14)

请参阅我关于Handling GO Separators in SQL - The Easy Way的博文。诀窍是使用SMO's ExecuteNonQuery()方法。例如,这里有一些代码将运行目录中的所有脚本,而不管GO分隔符:

    using System;
    using System.IO;
    using System.Data.SqlClient;
    using System.Collections.Generic;

    //Microsoft.SqlServer.Smo.dll
    using Microsoft.SqlServer.Management.Smo;
    //Microsoft.SqlServer.ConnectionInfo.dll
    using Microsoft.SqlServer.Management.Common;

    public class RunAllSqlSriptsInDirectory
    {
        public static void Main()
        {
            string scriptDirectory = "c:\\temp\\sqltest\\";
            string sqlConnectionString = "Integrated Security=SSPI;" + 
                "Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
            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();
                SqlConnection connection = new SqlConnection(sqlConnectionString);
                Server server = new Server(new ServerConnection(connection));
                server.ConnectionContext.ExecuteNonQuery(script);
            }
        }
    }

答案 1 :(得分:7)

GO不是Transact-SQL语句,是工具批处理分隔符。在批处理中遇到GO时,服务器正确地抱怨语法错误。您需要将文件拆分为批次,然后执行单个批次。使用正则表达式将文件分批批处理并在单行上识别GO不区分大小写。

答案 2 :(得分:3)

使用拆分方法执行批处理存在一个小问题。问题是评论。假设您对文件内容没有任何权力。你只需要执行它。在多行注释中的GO将是这里的每个解决方案示例中的问题,即使用“GO”作为分隔符来拆分sql代码。例如:

[some sql code]
GO

/* start of commented out sql code ***********
[some sql code]
GO
end of commented out sql code ****************/

[some sql code]
GO

这需要一些比分割更复杂的解析。这将不再适用:

Regex regex = new Regex("^GO", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string[] lines = regex.Split(sql);

此代码也忽略了空格可能导致GO。

答案 3 :(得分:2)

这是因为GO实际上不是本机TSQL语句,它在Management Studio / Enterprise Manager中用于将脚本分成批次。

您需要:
1)在每个GO语句上将其拆分为多个单独的脚本 2)在SQL管理对象中使用Server类,例如here

答案 4 :(得分:0)

您必须进行两次解析。第一次传递是删除所有注释并构建一个新字符串。第二步是使用基于GO关键字的REGEX拆分。