我有一个 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/