一尘不染

如何使用SqlConnection使用注释和GO语句执行SQL?

sql

我似乎无法执行使用DbCommand对象创建数据库的SQL。我究竟做错了什么?这是我的代码:

DbConnection connection; // initialized and opened elsewhere
DbCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();

这是错误:

查询语法无效。,靠近术语’/’,第1行,第2列。说明:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.Data.EntitySqlException:查询语法无效。,靠近术语’/’,第1行,第2列。

这是文件的第一部分。仅针对第一行中的注释引发异常:

/****** Object:  Table [dbo].[User]    Script Date: 10/08/2009 12:14:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [EmailAddress] [nvarchar](100) NULL,
 CONSTRAINT [PK_User] 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

可以从SQL Management StudioExpress执行相同的SQL脚本(实际上,应用程序生成了该脚本!)。这只是VisualStudio自己的服务器资源管理器查询视图,而从我自己的代码看来似乎失败了。


阅读 266

收藏
2021-03-17

共1个答案

一尘不染

您需要使用SQL管理类而不是普通的SqlCommand。
此页面显示了如何进行。
如果您尝试自己解析SQL,则总是会遗漏一些极端情况。例如,如果代码中的字符串包含带有前导和尾随回车符的单词“ GO”,该怎么办?

添加以下参考:

  • Microsoft.SqlServer.Smo
  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.SqlServer.Management.Sdk.Sfc (编辑:不需要此引用)

然后,您可以使用以下代码:

string connectionString, scriptText;
SqlConnection sqlConnection = new SqlConnection(connectionString);
ServerConnection svrConnection = new ServerConnection(sqlConnection);
Server server = new Server(svrConnection);
server.ConnectionContext.ExecuteNonQuery(scriptText);
2021-03-17