8

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自体は問題ないように見えるので、私は何を間違っていますか?

どうもありがとう

4

3 に答える 3

2

これは簡単なはずです...

GO を取り除きます。これは SSMS 固有の構文です。SQL 言語はそれを必要とせず、サポートもしていません。むしろ、個々の作成スクリプトを ; で終了する必要があります。. それがどうなるか教えてください。

于 2013-03-25T16:23:50.520 に答える
2

私の知る限り、単一の ADO.NET オブジェクトを設定して、バッチ ターミネータ ("GO") を含むスクリプトを実行することはできません。次の 2 つのいずれかを行う必要があります。

  1. SQL Management Studio オブジェクトを作成し、バックグラウンドで実行します。SQL Management Studio のフォルダーには、SSMS から作業できる DLL があることを知っています。誰かのために SSMS を開いてロードしようとする .NET コードを作成しましたが、直接実行することはありません。

  2. for each メソッドを実行し、SQL スクリプトを分割して、'GO' ステートメントからリストなどのメモリにオブジェクトの配列を作成します。次に、「foreach」ステートメントを使用してそのリストを反復処理し、適切な try/catch ブロックを使用してそれぞれを実行します。

于 2013-03-25T16:26:10.360 に答える