参数数据类型与数据库数据类型

时间:2016-01-10 08:57:43

标签: c# sql-server

关于参数SQL数据类型?

在我的SQL Server数据库表中,我在那里定义了数据类型。

我的问题是在参数和数据库数据类型中它们应该是相同的数据类型吗?

示例Enumber数据类型在SQL Server中为INT,在参数SqlDataType中也是INT

但是当我运行它时说数据类型需要将字符串转换为int32?

我的数据类型有问题吗?

学生

// Adding data to table Employee from database
cmd.CommandText = "Insert into Employee(Enumber,Inumber,Pnumber,Fname,Mname,Sname,Age,Bdate,Gender,Mstatus,Nationality,Eaddress,Cnumber,Picture) Values (@Enumber,@Inumber,@Pnumber,@Fname,@Mname,@Sname,@Age,@Bdate,@Gender,@Mstatus,@Nationality,@Eaddress,@Cnumber,@Picture)";

cmd.Parameters.Add("@Enumber",SqlDbType.Int).Value = txtEnumber.Text;
cmd.Parameters.Add("@Inumber",SqlDbType.Int).Value = txtInumber.Text;
cmd.Parameters.Add("@Pnumber",SqlDbType.VarChar,20).Value = txtPassport.Text;
cmd.Parameters.Add("@Fname",SqlDbType.VarChar,50).Value =  txtFname.Text;
cmd.Parameters.Add("@Mname",SqlDbType.VarChar,50).Value = txtMname.Text;
cmd.Parameters.Add("@Sname",SqlDbType.VarChar,50).Value = txtSname.Text;
cmd.Parameters.Add("@Age", SqlDbType.Int).Value = txtAge.Text;
cmd.Parameters.Add("@Bdate",SqlDbType.VarChar).Value = DtpBdate.Text;
cmd.Parameters.Add("@Gender",SqlDbType.VarChar,20).Value = cbGender.Text;
cmd.Parameters.Add("@Mstatus",SqlDbType.VarChar,20).Value = cbMstatus.Text;
cmd.Parameters.Add("@Nationality",SqlDbType.VarChar,30).Value = txtNationality.Text;
cmd.Parameters.Add("@Eaddress",SqlDbType.VarChar,50).Value =  txtEAddress.Text;
cmd.Parameters.Add("@Cnumber",SqlDbType.Int).Value = txtCnumber.Text;
cmd.Parameters.Add("@Picture",SqlDbType.VarChar).Value =  ImageToBase64(PbImage.Image, System.Drawing.Imaging.ImageFormat.Jpeg);

cmd.ExecuteNonQuery();

1 个答案:

答案 0 :(得分:3)

此错误是由用于填充Int参数为空的一个或多个TextBox引起的。在这种情况下,尝试转换分配给Int参数的字符串值的内部代码将失败。这只发生在执行时而不是在分配时,因为Parameter.Value属性被定义为对象。

可能的解决方法可能是

cmd.CommandText = "Insert into Employee(Enumber,Inumber,Pnumber,.....)";
cmd.Parameters.Add("@Enumber",SqlDbType.Int).Value = 
     string.IsNullOrWhiteSpace(txtEnumber.Text) ? "0" : txtEnumber.Text ;

但这不是一个好的解决方案,因为您的用户可以在这些文本框中键入任何内容。所以你真的应该在尝试插入之前添加一个验证级别,并添加一个实数作为值。

int enumber;
if(!Int32.TryParse(txtENumber.Text, out enumber))
{
   MessageBox.Show("Type a number");
   return;
}

cmd.Parameters.Add("@Enumber",SqlDbType.Int).Value = enumber;

这也适用于其他文本框。

相关问题