我创建了一个带有以下签名的方法;
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中调试。
错误是;
字符串[6]:大小属性的大小无效
为什么我在字符串6中收到此错误?
注意:我目前正在为参数6,7,8提供空值,因为它们作为outparamter返回。
在sql server中,我运行存储过程并输出预期结果;
答案 0 :(得分:14)
我不知道你正在使用的ClsDatabaseManager
类,但使用SqlParameterCollection
属性的SqlCommand.Parameters
类型,你必须在调用{{3}时指定一个大小} nvarchar
参数的函数。
因此,我会说你应该能够做到这样的事情:
dbManager.AddParameters(0, "@RegistrationNo", registrationNo, 50);
指定与存储过程相同的字符串长度。
答案 1 :(得分:0)
尝试将任何非空值分配给输出参数,例如:
dbManager.Parameters["@Name"].SqlValue = "";
dbManager.Parameters["@GeneratedTimeIn"].SqlValue = DateTime.Now();
dbManager.Parameters["@ImageUrl"].SqlValue = "";
答案 2 :(得分:0)
如果您使用方向为InputOutput的参数(以返回值),也会出现错误消息。如前所述,设置大小可以解决问题。