c# - 如何使用 SqlCommand 将多个 T-SQL 语句(由 GO 分隔)链接到对 SQL 的单个调用中

标签 c# .net sql sqlcommand

我有一个 C# 桌面应用程序,它调用各种 SQL Server 存储过程来执行将数据导出和导入到 SQL Server 2008 R2 数据库的各种工作。

这些都很好,没问题。我的应用程序使用所有参数等调用它们都很好。

为了“协助用户”,我编写了一个按钮,用于将所有存储过程添加到已配置的数据库中。为此,我创建了一个脚本:

USE [%DATABASENAME%]
GO        

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc1]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc1]
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc2]
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc3]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc3]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spMyProc1]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO
--

CREATE PROCEDURE [dbo].[spMyProc2]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO
--

CREATE PROCEDURE [dbo].[spMyProc3]
        @VariousParams varchar(100),
    @ResultText varchar(4000) OUTPUT
AS
BEGIN
  -- Code removed for brevity
END

GO

当我在 SQL Server Management Studio 中运行它时,它运行良好,完全没有问题。

但是在我的 C# 应用程序中,抛出了一个异常,我收到了如下错误:

Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
A RETURN statement with a return value cannot be used in this context.
A RETURN statement with a return value cannot be used in this context.
Incorrect syntax near 'GO'.
Must declare the scalar variable "@MessageText".
Must declare the scalar variable "@ListOfIDsToImport".
Must declare the scalar variable "@SourceDataFolder".
Must declare the scalar variable "@SourceDataFolder".
Must declare the scalar variable "@SequenceNo".
Must declare the scalar variable "@UserID".
Must declare the scalar variable "@SequenceNo".
Must declare the scalar variable "@UserID".
Must declare the scalar variable "@ListOfIDsToImport".
Must declare the scalar variable "@ListOfIDsToImport".
Must declare the scalar variable "@ListOfIDsToImport".
Must declare the scalar variable "@MessageText".
Must declare the scalar variable "@MessageText".
Must declare the scalar variable "@MessageText".
Incorrect syntax near 'GO'.
The variable name '@PS_DEFAULT' has already been declared. Variable names must be unique within a query batch or stored procedure.
The variable name '@PS_ERROR_MSG' has already been declared. Variable names must be unique within a query batch or stored procedure.
The variable name '@PS_ERROR_SEVERITY' has already been declared. Variable names must be unique within a query batch or stored procedure.
Must declare the scalar variable "@SequenceNo".
Incorrect syntax near 'GO'.

(这是下面代码中的 catch block 捕获的 ex.Message 中的内容)。

我的代码非常简单如下:

    bool retVal = false;
    string command = Properties.Resources.MyApp_StoredProcedures.ToString().Replace("%DATABASENAME%", Properties.Settings.Default.DBName);

    try
    {
        sqlCmd = new SqlCommand(command, csSQLConnection._conn);
        sqlCmd.ExecuteNonQuery();
        retVal = true;
    }
    catch (Exception ex)
    {
        retVal = false;
    }
    finally
    {
        sqlCmd.Dispose();
    }

(上面的替换只是替换了脚本顶部 USE 行中的占位符,当我单步执行并越过该行时,它可以正常工作)。

所以基本上,我做错了什么,因为 SQL 本身看起来很好?

非常感谢

最佳答案

这应该很容易......

摆脱 GO,这是 SSMS 特定的语法,SQL 语言不需要或不支持它,而您应该使用 ; 终止您的个人创建脚本。 .让我知道进展如何。

关于c# - 如何使用 SqlCommand 将多个 T-SQL 语句(由 GO 分隔)链接到对 SQL 的单个调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15619729/

相关文章:

c# - Botframework V4 - 如何结束对话?

mysql - 在 MySQL 5.6.27 中创建触发器时出现奇怪的错误

.net - 如何重新排列字符串中的字符?

c# - 将数据行从一个表复制到不同数据库中的另一个类似表 c#

c# - Xamarin.Forms:用于在 UITableViewCell 上显示披露指示器的自定义渲染器

c# - 如何使 WPF 应用程序在屏幕上居中?

.net - ASP 成员(member)/用户管理的 Web 前端?

sql - 与给定表或 View 有关系的所有表的列表

mysql - SQL LIMIT 不能正常工作

c# - 尝试将 xml 数组反序列化为具有子类的 C# 类