2013-02-25 7 views
5

Ich habe eine Methode mit einer folgenden Signatur erstellt.Ausnahmebedingung: Die Size-Eigenschaft hat eine ungültige Größe von 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); 

} 

Während meine gespeicherte Prozedur aussieht;

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 

Wenn jedoch i 2323 (Wert) eingeben in einem Textfeld und klicken Sie auf eine Schaltfläche (auf aspx), erhalte ich einen Fehler. Ich debugge auch im visuellen Studio.
Der Fehler ist; String [6]: Die Size-Eigenschaft hat eine ungültige Größe von 0
Warum bekomme ich diesen Fehler bei String 6?
Hinweis: Ich liefere den Parametern 6, 7 und 8 momentan Nullwerte, da sie als Outparamter zurückgegeben werden. Visual Studio Screen Shot

Während in SQL Server laufen i die gespeicherte Prozedur und gibt die erwarteten Ergebnisse;
enter image description here

Antwort

14

Ich weiß nicht, über die ClsDatabaseManager Klasse, die Sie verwenden, aber mit dem SqlParameterCollection Typ des SqlCommand.Parameters Eigenschaft, haben Sie eine Größe angeben, wenn die Add() Funktion für nvarchar Parameter aufrufen.

So würde ich sagen, dass Sie in der Lage sein sollten, wie etwas zu tun:

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

die gleiche String-Länge als Ihre gespeicherte Prozedur angeben.

+0

ich habe laufen und Rückgabewert Parameter mit einer anderen erfolgreich Methode verwendet werden. Und ich folge dem gleichen Ansatz genau hier. Aber es funktioniert nicht. Und ClsDatabaseManager ist meine Klasse –

+0

@DotNetDreamer Versuchen Sie, eine Länge angeben und sehen, was passiert. – Snixtor

+2

+1 Die Einstellung von 'SqlParameter.Size' auf 50 löst das Problem. –

0

versuchen, jeden Nicht-Null-Wert zu Ausgabeparameter zuweisen, so etwas wie:

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