【问题标题】:Getting Exception : The Size Property Has an Invalid Size Of 0出现异常:Size 属性的大小无效为 0
【发布时间】:2013-02-25 07:33:32
【问题描述】:

我创建了一个带有以下签名的方法;

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 无效
为什么我在字符串 6 处收到此错误?
注意:我目前正在为参数 6、7、8 提供空值,因为它们作为外参数返回。

在 sql server 中,我运行存储过程并输出预期结果;

【问题讨论】:

    标签: c# asp.net visual-studio


    【解决方案1】:

    我不知道您正在使用的ClsDatabaseManager 类,但是对于SqlCommand.Parameters 属性的SqlParameterCollection 类型,您必须在为Add() 参数调用Add() 函数时指定大小。

    因此我会说您应该能够执行以下操作:

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

    指定与存储过程相同的字符串长度。

    【讨论】:

    • 我已经成功地使用 out 参数和另一种方法运行并返回值。我在这里也遵循同样的方法。但它不起作用。 ClsDatabaseManager 是我的课
    • @DotNetDreamer 尝试指定一个长度,看看会发生什么。
    • 谢谢哥们,它解决了这个问题。问题是大小。喜欢你的解决方案。
    【解决方案2】:

    尝试为输出参数分配任何非空值,例如:

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

    【讨论】:

      【解决方案3】:

      如果您使用具有 InputOutput 方向输出的参数(返回值),也会出现错误消息。如前所述,设置 Size 可以解决问题。

      【讨论】:

        猜你喜欢
        • 2012-01-27
        • 2011-04-15
        • 2020-01-22
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多