5

次のシグネチャを持つメソッドを作成しました。

public bool CheckEmployeeRegistrationNo(string registrationNo, DateTime timeIn, int createdBy,
    DateTime createdDate, int updatedBy, DateTime updatedDate)
{
    ClsDatabaseManager dbManager = ClsDatabaseManager.InitializeDbManager();

    dbManager.CreateParameters(9);
    dbManager.AddParameters(0, "@RegistrationNo", registrationNo);
    dbManager.AddParameters(1, "@CreatedBy", createdBy);
    dbManager.AddParameters(2, "@CreatedDate", createdDate);
    dbManager.AddParameters(3, "@UpdatedBy", updatedBy);
    dbManager.AddParameters(4, "@UpdatedDate", updatedDate);
    dbManager.AddParameters(5, "@TimeIn", timeIn);
    dbManager.AddParameters(6, "@Name", EmployeeName, System.Data.ParameterDirection.Output);
    dbManager.AddParameters(7, "@GeneratedTimeIn", GeneratedTimeIn, System.Data.ParameterDirection.Output);
    dbManager.AddParameters(8, "@ImageUrl", ImageUrl, System.Data.ParameterDirection.Output);

    int result = -1;
    try
    {
        dbManager.Open();
        result = dbManager.ExecuteNonQuery("usp_EmployeeCheckRegNo");
        if (result > 0)
        {
            EmployeeName = dbManager.Parameters[6].Value.ToString();
            GeneratedTimeIn = dbManager.Parameters[7].Value.ToDate();
            ImageUrl = dbManager.Parameters[8].Value.ToString();
        }
        dbManager.Dispose();
    }
    catch (Exception ex)
    {
        dbManager.Dispose();
        throw ex;
    }

    return (result != -1);

}

私のストアドプロシージャは次のようになりますが、

ALTER PROC [dbo].[usp_EmployeeCheckRegNo]
(
    @RegistrationNo nvarchar(50),
    @TimeIn Datetime,
    @CreatedBy INT,
    @CreatedDate datetime,
    @UpdatedBy INT,
    @UpdatedDate datetime,
    @Name nvarchar(50) OUT,
    @GeneratedTimeIn datetime OUT,
    @ImageUrl nvarchar(100) OUT
)
AS

BEGIN

if Exists 
(
    select RegistationNo 
    FROM [Employe].Registration
    WHERE [RegistationNo] = @RegistrationNo
)
    BEGIN
        INSERT INTO [Employe].[Attendance]
        (
            RegistrationNo,
            [TimeIn],
            [CreatedBy],
            [CreatedDate],
            [UpdatedBy],
            [UpdatedDate]
        )
        VALUES
        (
            @RegistrationNo,
            @TimeIn,
            @CreatedBy,
            @CreatedDate,
            @UpdatedBy,
            @UpdatedDate
        )
         SET @Name = (select er.Name FROM [Employe].[Registration] er
            WHERE er.[RegistationNo] = @RegistrationNo);
         SET @GeneratedTimeIn = (select a.TimeIn 
            FROM [Employe].Attendance a
            WHERE a.RegistrationNo = @RegistrationNo);
         SET @ImageUrl = (select er.[Image] 
            FROM [Employe].[Registration] er
            WHERE er.RegistationNo = @RegistrationNo);
    END
ELSE
    return 0
END

ただし、テキスト ボックスに 2323 (値) を入力してボタン (.aspx) をクリックすると、エラーが発生します。Visual Studio でのデバッグも行っています。
エラーは次のとおりです。 String[6]: Size プロパティに無効なサイズ 0 があり
ます String 6 でこのエラーが発生するのはなぜですか?
注: 現在、パラメーター 6、7、8 に null 値を指定しています。これは、outparamter として返されるためです。 ビジュアルスタジオのスクリーンショット

SQL サーバーで、ストアド プロシージャを実行し、期待される結果を出力します。
ここに画像の説明を入力

4

3 に答える 3

14

ClsDatabaseManager使用しているクラスについてはわかりませんがSqlParameterCollection、プロパティのタイプでは、パラメーターの関数をSqlCommand.Parameters呼び出すときにサイズを指定する必要があります。Add()nvarchar

したがって、次のようなことができるはずです。

dbManager.AddParameters(0, "@RegistrationNo", registrationNo, 50);

ストアド プロシージャと同じ文字列長を指定します。

于 2013-02-25T07:59:21.597 に答える