使用Dapper执行带有GO的查询

9

我正在尝试使用Dapper运行SQL查询:

use master
go

if exists (select name from sys.databases where name = N'TestDB')
drop database [TestDB]
go

create database [TestDB] on primary ( 
  name = 'TestDB_Data',
  filename = '$Path\TestDB_Data.mdf',
  size = 40MB,
  maxsize = 2GB,
  filegrowth = 20MB 
)

use [TestDB]
go

create table dbo.Posts
(
  Id int identity not null,
  Body nvarchar (max) null
);

我正在使用Dapper,如下所示:

using (SqlConnection connection = new SqlConnection(connectionString)) {
  connection.Open();
  connection.Execute(sqlQuery);
}

然而,当我使用GO语句时出错了。

但是,如果我删除GO语句,则在创建帖子时会出现错误,因为TestDB表尚未创建。

是否有一种使用Dapper来解决这个问题的方法?

我只能使用SQL Server SDK才能做到这一点。


GO 不是 T-SQL 语句,它只是由某些 SQL Server 实用程序解释的指令。http://msdn.microsoft.com/en-us/library/ms188037.aspx - Pero P.
3个回答

10

GO不是SQL语句,它仅仅是一个批处理分隔符,实际上你可以将其重命名为任何你想要的名称。

batch seperator

管理工具知道如何解析SQL以识别语句边界。可以编写简单的解析器通过分割字符串中的"GO"来分组每个语句,并将其发送给Dapper。

但是,为了确保100%的正确性,你需要使用复杂的解析器

select '
GO ' GO from [GO] 

4

Dapper在此无能为力。我建议您尝试使用SQL Server Management Objects来执行像您提到的大型SQL命令,它也支持GO语句。

您可以查阅这篇博客文章了解逐步说明。


3
我解决了执行分离的问题。
 using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            foreach (var item in sqlQuery.Split("GO"))
            {
                conn.Execute(item);
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接