2013-02-25 9 views
5

stworzyłem metodę z następującym podpisem;Pierwsze wyjątek: właściwość rozmiaru ma nieprawidłowy rozmiar 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); 

} 

Podczas gdy moja procedura przechowywana wygląda;

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 

Jednak kiedy wchodzę 2323 (wartość) w polu tekstowym, a następnie kliknij na przycisk (na .aspx), otrzymuję błąd. Również debuguję w visual studio.
Błąd jest następujący; Ciąg [6]: właściwość rozmiaru ma nieprawidłowy rozmiar 0
Dlaczego pojawia się ten błąd w łańcuchu 6?
Uwaga: aktualnie dostarczam wartości null do parametrów 6, 7, 8, ponieważ są one zwracane jako outparamter. Visual Studio Screen Shot

Podczas gdy w serwerze SQL, uruchomić procedurę przechowywaną i wyjście oczekiwanych rezultatów;
enter image description here

Odpowiedz

14

nie wiem o klasie ClsDatabaseManager używanego ale z rodzajem nieruchomości SqlCommand.ParametersSqlParameterCollection, trzeba określić rozmiar po wywołaniu funkcji Add() dla nvarchar parametrów.

Tak więc powiedziałbym, że powinieneś być w stanie zrobić coś takiego:

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

określić taką samą długość łańcucha jako procedura składowana.

+0

Mam biegać i zwracana wartość parametru z wykorzystaniem innej metody z powodzeniem. I podążam tym samym podejściem tutaj. Ale to nie działa. A ClsDatabaseManager to moja klasa. –

+0

@DotNetDreamer Spróbuj mimo to określić długość i zobacz, co się stanie. – Snixtor

+2

+1 Ustawianie 'SqlParameter.Size' 50 rozwiązuje problem. –

0

Spróbuj przypisać dowolną niezerową wartość parametrów wyjściowych, coś jak:

dbManager.Parameters["@Name"].SqlValue = ""; 
dbManager.Parameters["@GeneratedTimeIn"].SqlValue = DateTime.Now(); 
dbManager.Parameters["@ImageUrl"].SqlValue = ""; 
Powiązane problemy