嗨大家,请帮我解决我遇到问题的代码,我有两张桌子;一个员工表和另一个分支表。分支ID将存储在employee表中,该表是外键。当我通过存储过程插入数据时,我保持代码像bleow
Create procedure [dbo].[Insertemployee]
@d28 int,@d1 nchar(15),@d2 nchar(30),@d3 int,@d4 nchar(10),@d5 nchar(20),@d6 nchar(30),@d7 varchar(100),@d8 nchar(100),@d9 nchar(10),@d10 nchar(10),@d11 nchar(30),@d12 nchar(30),@d13 nchar(30),@d14 nchar(30),@d15 nchar(30),@d16 date,@d17 varchar(100),@d18 int,@d19 int,@d20 int,@d21 int,@d22 int,@d23 int,@d24 int,@d25 image,@d26 date,@d27 date,@d29 nchar(10)
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
insert into Employee(Id,StaffID,StaffName,Branchid,Gender,DOB,FatherName,PermanentAddress,Country,PhoneNo,MobileNo,DateOfJoining,VisaNumber,PassportNumber,PassportExpiryDate,NationalityID,NationalityIDExpiryDate,Designation,BasicSalary,CostOfAllowance,HRA,TeaAndSnacks,Bonus,Loan,OtherDeduction,Picture,createddate,lastmodified,Active) VALUES (@d28,@d1,@d2,(select branchid from Branch where Branch.BranchName=@d3),@d4,@d5,@d6,@d7,@d8,@d9,@d10,@d11,@d12,@d13,@d14,@d15,@d16,@d17,@d18,@d19,@d20,@d21,@d22,@d23,@d24,@d25,@d26,@d27,@d29);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT >0
BEGIN
ROLLBACK TRANSACTION
END
EXECUTE uspLogError
END CATCH
END;`
我的前端代码在
之下 cmd = new SqlCommand("InsertEmployee");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@d28",txtID.Text);
cmd.Parameters.AddWithValue("@d26", System.DateTime.Now);
cmd.Parameters.AddWithValue("@d27", System.DateTime.Now);
cmd.Parameters.AddWithValue("@d1", txtStaffID.Text);
cmd.Parameters.AddWithValue("@d2",txtStaffName.Text);
cmd.Parameters.AddWithValue("@d3",txtDepartment.Text);
cmd.Parameters.AddWithValue("@d4",cmbGender.Text);
cmd.Parameters.AddWithValue("@d6",txtFatherName.Text);
cmd.Parameters.AddWithValue("@d7",txtPAddress.Text);
cmd.Parameters.AddWithValue("@d8",txtTAddress.Text);
cmd.Parameters.AddWithValue("@d9",txtPhoneNo.Text);
cmd.Parameters.AddWithValue("@d10",txtMobileNo.Text);
cmd.Parameters.AddWithValue("@d11",dtpDateOfJoining.Value);
cmd.Parameters.AddWithValue("@d12",visanumber.Text.Trim());
cmd.Parameters.AddWithValue("@d14",PassportExpirydate.Text);
cmd.Parameters.AddWithValue("@d15",NationalityID.Text.Trim());
if (NationalityID.Text == "")
{
cmd.Parameters.AddWithValue("@d16", "");
}
else
{
cmd.Parameters.AddWithValue("@d16", NationalityExpirydate.Value);
}
cmd.Parameters.AddWithValue("@d17",txtDesignation.Text.Trim());
cmd.Parameters.AddWithValue("@d13",Passportnumber.Text.Trim());
cmd.Parameters.AddWithValue("@d18",Convert.ToInt32(txtBasicSalary.Text.Trim()));
if (txtLIC.Text == "")
{
cmd.Parameters.AddWithValue("@d19", 0);
}
else
{
cmd.Parameters.AddWithValue("@d19",Convert.ToInt32(txtLIC.Text.Trim()));
}
if (txtGrpInsurance.Text == "")
{
cmd.Parameters.AddWithValue("@d21", 0);
}
else
{
cmd.Parameters.AddWithValue("@d21",Convert.ToInt32(txtGrpInsurance.Text.Trim()));
}
if (txtFamilyBenefitFund.Text == "")
{
cmd.Parameters.AddWithValue("@d22",0);
}
else
{
cmd.Parameters.AddWithValue("@d22",Convert.ToInt32(txtFamilyBenefitFund.Text.Trim()));
}
if (txtLoans.Text == "")
{
cmd.Parameters.AddWithValue("@d23",0);
}
else
{
cmd.Parameters.AddWithValue("@d23",Convert.ToInt32(txtLoans.Text.Trim()));
}
if (txtOtherDeductions.Text == "")
{
cmd.Parameters.AddWithValue("@d24",0);
}
else
{
cmd.Parameters.AddWithValue("@d24",Convert.ToInt32(txtOtherDeductions.Text.Trim()));
}
if (txtIncomeTax.Text == "")
{
cmd.Parameters.AddWithValue("@d20",0);
}
else
{
cmd.Parameters.AddWithValue("@d20",Convert.ToInt32(txtIncomeTax.Text.Trim()));
}
cmd.Parameters.AddWithValue("@d29", chkActive.Text);
cmd.Parameters.AddWithValue("@d5",DOB.Text);
MemoryStream ms = new MemoryStream();
Bitmap bmpImage = new Bitmap(pictureBox1.Image);
bmpImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer();
SqlParameter p = new SqlParameter("@d25", SqlDbType.Image);
p.Value = data;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
答案 0 :(得分:1)
d3
字段可以接受int,但是你传递字符串`
默认类型TextBox
是字符串
你可以通过转换为int
来解决这个问题cmd.Parameters.AddWithValue("@d3",txtDepartment.Text);
到
cmd.Parameters.AddWithValue("@d3",Convert.ToInt(txtDepartment.Text));
答案 1 :(得分:1)
您将几个字段作为字符串传递给DB数据类型int:
cmd.Parameters.AddWithValue(" @ D28",txtID.Text);
cmd.Parameters.AddWithValue(" @ D3",txtDepartment.Text);
你应该在将它们传递给db
之前将它们转换为int cmd.Parameters.AddWithValue("@d28",Convert.ToInt32(txtID.Text.Trim()));
cmd.Parameters.AddWithValue("@d3",Convert.ToInt32(txtDepartment.Text.Trim()));
只是好奇你的txtDepartment是如何成为int的类型,要么你必须检查是否有传递的字符串或它的数字。如果只接受数字,则可能需要检查传递给txtDepartment.Text和反向的值。
答案 2 :(得分:1)
我认为上述答案是正确的,他也找到了问题(恭喜)。但这里的实际问题是Parameters.AddWithValue
。它不允许您指定类型,并将导致此类数据类型转换错误。所以我建议你使用Parameters.Add()
instead for Parameters.AddWithValue()
这样你就可以指定期望数据的类型,并且能够验证输入。你可以看到下面的例子(它也可以帮助你解决问题):
cmd.Parameters.Add("@d28", SqlDbType.Int).Value = int.Parse(txtID.Text.Trim());
其中SqlDbType
是一个Enumeration,它指定字段的属性的SQL Server特定数据类型,以供在SqlParameter中使用。 int.TryParse()
将是您从字符串到整数执行无错误转换的另一个最佳建议。
更新:似乎SP
接受不同类型的值,但您将全部作为字符串(.Text)。这将产生同样的问题,因此仅更改"@d28"
将无法解决问题,请尝试阅读附加的链接并对代码进行必要的更改。