2013-02-25 21 views
5

私は以下のシグネチャを持つメソッドを作成しました。例外の取得:Sizeプロパティのサイズが無効です0

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); 

} 

私のストアドプロシージャは次のようになります。私は、テキストボックスに2323(値)を入力し、(.aspxの上)ボタンをクリックしたときに

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 

しかし、私はエラーを取得しています。私はまた、ビジュアルスタジオでデバッグします。
エラーは次のとおりです。 String [6]:Sizeプロパティのサイズが無効です0
String 6でこのエラーが発生するのはなぜですか?
注:現在、outparamterとして返されるため、パラメータ6,7,8にnull値を供給しています。 Visual Studio Screen Shot

SQL Serverで、私は、ストアドプロシージャと出力期待される結果を実行している間、
enter image description here

答えて

14

私はあなたが使用しているClsDatabaseManagerクラスのことは知らないけどSqlCommand.Parameters財産のSqlParameterCollection種類で、あなたはnvarcharパラメータについてAdd()関数を呼び出すときのサイズを指定する必要があります。

したがって、私はあなたのような何かを行うことができるはずだと思います:

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

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

+0

を私はsucessfully別の方法でパラメータを使用して実行し、戻り値をしています。そして、私はここに同じaproachを続けています。しかし、それは動作していません。そしてClsDatabaseManagerは私のクラスです –

+0

@DotNetDreamerとにかく長さを指定して、何が起こるか見てみてください。 – Snixtor

+2

+1 'SqlParameter.Size'を50に設定すると、問題が解決します。 –

0

は、出力パラメータに何かnull以外の値を割り当てるようにしてください:

dbManager.Parameters["@Name"].SqlValue = ""; 
dbManager.Parameters["@GeneratedTimeIn"].SqlValue = DateTime.Now(); 
dbManager.Parameters["@ImageUrl"].SqlValue = ""; 
関連する問題