SQL Server 2008 R2 データベースにデータをエクスポートおよびインポートするさまざまな作業を実行するために、さまざまな SQL Server ストアド プロシージャを呼び出す C# デスクトップ アプリがあります。
これらはすべて問題なく動作します。そして、私のアプリは、すべてのパラメーターなどで問題なくそれらを呼び出します.
「ユーザーを支援する」ために、すべてのストアド プロシージャを構成済みデータベースに追加するボタンをコーディングしています。この目的のために、次の行に沿ってスクリプトを作成しました。
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」を宣言する必要があります。
スカラー変数「@SequenceNo」を宣言する必要があります。
スカラー変数「@UserID」を宣言する必要があります。
スカラー変数「@SequenceNo」を宣言する必要があります。
スカラー変数「@UserID」を宣言する必要があります。
スカラー変数「@ListOfIDsToImport」を宣言する必要があります。
スカラー変数「@ListOfIDsToImport」を宣言する必要があります。
スカラー変数「@ListOfIDsToImport」を宣言する必要があります。
スカラー変数「@MessageText」を宣言する必要があります。
スカラー変数「@MessageText」を宣言する必要があります。
スカラー変数「@MessageText」を宣言する必要があります。
「GO」付近の構文が正しくありません。
変数名 '@PS_DEFAULT' は既に宣言されています。
変数名 '@PS_ERROR_MSG' は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で一意である必要があります。
変数名 '@PS_ERROR_SEVERITY' は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で一意である必要があります。
スカラー変数「@SequenceNo」を宣言する必要があります。
「GO」付近の構文が正しくありません。
(これは、以下のコードの catch ブロックによってキャッチされた 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自体は問題ないように見えるので、私は何を間違っていますか?
どうもありがとう