我有一个C#桌面应用程序,它调用各种SQL Server存储过程来执行将数据导出和导入到SQL Server的各种工作2008 R2数据库。如何将多个T-SQL语句(用GO分隔)链接为使用SqlCommand对SQL的单个调用
这些工作都很好,没问题。我的应用程序通过所有参数调用它们都很好。
为了“帮助用户”,我编写了一个按钮来将所有存储过程添加到配置的数据库。为此,我创建了一个脚本,沿着线:
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#应用程序,会抛出异常,我得到错误的船载如下:
附近有语法错误“GO”。
'GO'附近语法不正确。
'GO'附近语法不正确。
'GO'附近语法不正确。
'GO'附近语法不正确。
'GO'附近语法不正确。
'CREATE/ALTER PROCEDURE'必须是查询批处理中的第一条语句。
具有返回值的RETURN语句不能在此上下文中使用。
具有返回值的RETURN语句不能在此上下文中使用。
'GO'附近语法不正确。
必须声明标量变量“@MessageText”。
必须声明标量变量“@ListOfIDsToImport”。
必须声明标量变量“@SourceDataFolder”。
必须声明标量变量“@SourceDataFolder”。
必须声明标量变量“@SequenceNo”。
必须声明标量变量“@UserID”。
必须声明标量变量“@SequenceNo”。
必须声明标量变量“@UserID”。
必须声明标量变量“@ListOfIDsToImport”。
必须声明标量变量“@ListOfIDsToImport”。
必须声明标量变量“@ListOfIDsToImport”。
必须声明标量变量“@MessageText”。
必须声明标量变量“@MessageText”。
必须声明标量变量“@MessageText”。
'GO'附近语法不正确。
变量名'@PS_DEFAULT'已被声明。变量名称在查询批处理或存储过程中必须是唯一的。
变量名'@PS_ERROR_MSG'已被声明。变量名称在查询批处理或存储过程中必须是唯一的。
变量名'@PS_ERROR_SEVERITY'已被声明。变量名称在查询批处理或存储过程中必须是唯一的。
必须声明标量变量“@SequenceNo”。
'GO'附近语法不正确。
(这是ex.Message中的内容,由catch代码块在下面的代码中捕获)。
我的代码是非常简单如下:
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();
}
(替换上面简单地在脚本的顶部取代了使用线路占位符和它的作品,因为我可以看到当我一步境而过那条线)。
所以基本上,我做错了,因为SQL本身似乎很好?
非常感谢
你基本上需要打破你在每个'GO'脚本中执行每个“子脚本”作为对'SqlCommand.ExecuteNonQuery()'的单独调用,以满足像'CREATE/ALTER PROCEDURE'这样的要求必须是查询批处理中的第一条语句。 * – 2013-03-25 16:45:44