4

SQL Serverと対話するC#プログラムを作成しています。私は愚かなことにクエリ文字列をC#プログラムにハードコーディングし、代わりにそれらをサーバー上のストアドプロシージャに変換したいと考えていました。

何らかの理由で、1つの特定のINSERTステートメント(正常に機能していました!)が機能しなくなり、その理由がわかりません。SQLプロファイラートレースを実行したこともありますが、ステートメントが完全に形成されていることがわかります。多分誰かが私が間違っていることを教えてくれるでしょう。

ストアドプロシージャ:このSPは、一連のパラメータを取得してテーブルに挿入するだけです。とてもシンプルです。

ALTER PROCEDURE [dbo].[usp_InsertNewChangeRequest]

@Requester INT,
@ChangeCreationDate DATETIME,
@ChangeName VARCHAR(200),
@ChangeDescription VARCHAR(1000),
@LastModifiedDate DATETIME,
@LastModifiedBy INT,
@AffectedArea INT,
@ImplementationPlan VARCHAR(MAX),
@BackoutPlan VARCHAR(MAX),
@RiskLevel TINYINT,
@ApprovalRequired BIT,
@IsApproved BIT
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO dbo.ChangeRequests(Requester, ChangeCreationDate, ChangeName, ChangeDescription, 
            LastModifiedDate, LastModifiedBy, AffectedArea, ImplementationPlan, BackoutPlan, 
            RiskLevel, ApprovalRequired, IsApproved)
VALUES (@Requester, @ChangeCreationDate, @ChangeName, @ChangeDescription,
            @LastModifiedDate, @LastModifiedBy, @AffectedArea, @ImplementationPlan, @BackoutPlan,
            @RiskLevel, @ApprovalRequired, @IsApproved) 
END

C#のコードは、SPパラメーターを準備してから、非クエリを呼び出します。

public int InsertNewChange(int RequesterID, DateTime CreationDate, string ChangeName,
        string ChangeDescription, DateTime LastModifiedDate, 
        int AffectedAreaID, string ImplementationPlan, string BackoutPlan,
        int RiskLevel, int ApprovalRequired, int IsApproved)
    {
        int retval = 0;

        // Create a command whose name is the stored procedure for inserts
        SqlCommand command = new SqlCommand("usp_InsertNewChangeRequest", scConnection);
        command.CommandType = CommandType.StoredProcedure;

        // add the parameters to the stored procedure
        command.Parameters.Add(new SqlParameter("@Requester", RequesterID));
        command.Parameters.Add(new SqlParameter("@ChangeCreationDate", CreationDate));
        command.Parameters.Add(new SqlParameter("@ChangeName", ChangeName));
        command.Parameters.Add(new SqlParameter("@ChangeDescription", ChangeDescription));
        command.Parameters.Add(new SqlParameter("@LastModifiedDate", LastModifiedDate));
        command.Parameters.Add(new SqlParameter("@LastModifiedBy", RequesterID));
        command.Parameters.Add(new SqlParameter("@AffectedArea", AffectedAreaID));
        command.Parameters.Add(new SqlParameter("@ImplementationPlan", ImplementationPlan));
        command.Parameters.Add(new SqlParameter("@BackoutPlan", BackoutPlan));
        command.Parameters.Add(new SqlParameter("@RiskLevel", RiskLevel));
        command.Parameters.Add(new SqlParameter("@ApprovalRequired", ApprovalRequired));
        command.Parameters.Add(new SqlParameter("@IsApproved", IsApproved));

        retval = command.ExecuteNonQuery();
        return retval;
    }

私は常に-1の戻り値を取得していますが、以前は、SQLテキストを完全にC#でスペルアウトすると、1行が挿入されると1が取得されていました。

腹立たしいことに、トレースを実行しているときにSQLプロファイラーにエラーは表示されません。渡されたステートメントを示しており、完全に正常に見えます。切り取ってManagementStudioに貼り付け、手動で実行すると、正常に機能します。

    exec usp_InsertNewChangeRequest @Requester=4,@ChangeCreationDate='2012-05-16 17:55:45',@ChangeName='test name',@ChangeDescription='test description',@LastModifiedDate='2012-05-16 17:56:01.937',@LastModifiedBy=4,@AffectedArea=2,@ImplementationPlan='test implem',@BackoutPlan='test backout',@RiskLevel=1,@ApprovalRequired=0,@IsApproved=0

なぜこれが私に起こるのか誰かが知っていますか?どうもありがとう!

4

2 に答える 2

16

オフにしたため:

SET NOCOUNT ON;
于 2012-05-16T22:02:32.750 に答える
1

@@RowCount;の場合に返される行数に依存する代わりに、使用してみましたかINSERT, UPDATE, or DELETE

SPの周りには多くの提案が@@RowCountあり、SET NOCOUNT ON;

于 2012-05-16T22:16:20.827 に答える