2013-02-25 10 views
5

ho creato un metodo con una firma successiva;Eccezione: la proprietà Size ha una dimensione non valida pari a 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); 

} 

Mentre la procedura memorizzata è simile;

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 

Tuttavia, quando entro 2323 (valore) in una casella di testo e fare clic su un pulsante (l'aspx), sto ottenendo un errore. Ho anche il debug in Visual Studio.
L'errore è; Stringa [6]: La proprietà dimensione ha una dimensione non valida 0
Perché ottengo questo errore in String 6?
Nota: attualmente sto fornendo valori null ai parametri 6, 7, 8 perché vengono restituiti come outparamter. Visual Studio Screen Shot

Mentre in sql server, ho eseguito la stored procedure e l'uscita dei risultati attesi;
enter image description here

risposta

14

Non so sulla classe ClsDatabaseManager che si sta utilizzando, ma con la SqlParameterCollection tipo della proprietà SqlCommand.Parameters, è necessario specificare una dimensione quando si chiama la funzione Add() per nvarchar parametri.

Così direi che si dovrebbe essere in grado di fare qualcosa di simile:

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

per specificare la stessa lunghezza della stringa come stored procedure.

+0

ho correre e valore di ritorno utilizzando il parametro di un altro metodo con successo. E sto seguendo lo stesso approccio qui. Ma non sta funzionando. E ClsDatabaseManager è la mia classe –

+0

@DotNetDreamer Prova a specificare comunque una lunghezza e guarda cosa succede. – Snixtor

+2

+1 L'impostazione di 'SqlParameter.Size' su 50 risolve il problema. –

0

tenta di assegnare qualsiasi valore non nullo al parametro di uscita, qualcosa come:

dbManager.Parameters["@Name"].SqlValue = ""; 
dbManager.Parameters["@GeneratedTimeIn"].SqlValue = DateTime.Now(); 
dbManager.Parameters["@ImageUrl"].SqlValue = ""; 
Problemi correlati