我尝试创建一个在SQL Server数据库上运行.sql文件的方法。
我的代码是:
SqlConnection dbCon = new SqlConnection(connstr);
FileInfo file = new FileInfo(Server.MapPath("~/Installer/JobTraksDB.sql"));
StreamReader fileRead = file.OpenText();
string script = fileRead.ReadToEnd();
fileRead.Close();
SqlCommand command = new SqlCommand(script, dbCon);
try
{
dbCon.Open();
command.ExecuteNonQuery();
dbCon.Close();
}
catch (Exception ex)
{
throw new Exception("Failed to Update the Database, check your Permissions.");
}
但我一直收到关于“关键字'GO'附近的语法不正确”的错误 我的SQL文件如下所示:(从SQL Management Studio生成)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Job_Types](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_JobTypes] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
我应该如何执行此脚本?
答案 0 :(得分:5)
我们就是这样做的:
protected virtual void ExecuteScript(SqlConnection connection, string script)
{
string[] commandTextArray = System.Text.RegularExpressions.Regex.Split(script, "\r\n[\t ]*GO");
SqlCommand _cmd = new SqlCommand(String.Empty, connection);
foreach (string commandText in commandTextArray)
{
if (commandText.Trim() == string.Empty) continue;
if ((commandText.Length >= 3) && (commandText.Substring(0, 3).ToUpper() == "USE"))
{
throw new Exception("Create-script contains USE-statement. Please provide non-database specific create-scripts!");
}
_cmd.CommandText = commandText;
_cmd.ExecuteNonQuery();
}
}
使用一些文件读取功能加载脚本的内容。
答案 1 :(得分:4)
GO
不是一个T-SQL语句。这是对sqlcmd
或Management Studio等客户端工具的一个提示,用于拆分语句并将其作为单个批次发送。他们在自己的行上使用GO
命令作为标记来指示批处理的结束。您不应将整个文件发送到SQL Server。
旁注:您可以使用File.ReadAllText
方法代替这三行。
答案 2 :(得分:0)
如果您愿意包含几个SMO dll,可以使用几行代码执行脚本:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
public void Exec(string script)
{
using (var conn = new SqlConnection(ConnString))
{
var server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script, ExecutionTypes.ContinueOnError);
}
}
SMO库处理GO问题,因此您不必这样做。您需要参考以下程序集:
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll
Microsoft.SqlServer.Smo.dll