我有一个存储过程,当从C#代码执行它时我收到此错误。
将数据类型nvarchar转换为int时出错。
我的存储过程:
CREATE PROCEDURE [dbo].[donateBloodProc]
@donorName varchar(50),
@gender varchar(20),
@email varchar(50),
@bloodGroup varchar(50),
@contact_number int, @L_D_D date,
@city varchar(50),
@arid_number varchar(50),
@DepId int
AS
INSERT INTO
tblDonors(Dname, gender, bloodGroup, email, contact_number,
L_D_D,city,arid_number,DeptID,dateDonated)
VALUES
(@donorName,@gender,@bloodGroup,@email,@contact_number,
@L_D_D,@city,@arid_number,@DepId,GETDATE());
这是我的C#代码:
SqlCommand commandForSP = new SqlCommand("donateBloodProc",DALobj.openConnection());
commandForSP.CommandType = System.Data.CommandType.StoredProcedure;
commandForSP.Parameters.AddWithValue("@donorName", TextBox1.Text);
commandForSP.Parameters.AddWithValue("@gender", RadioButtonList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@email", TextBox5.Text);
commandForSP.Parameters.AddWithValue("@bloodGroup", DropDownList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@contact_number", TextBox2.Text);
commandForSP.Parameters.AddWithValue("@L_D_D", TextBox3.Text);
commandForSP.Parameters.AddWithValue("@city", DropDownList2.SelectedValue);
commandForSP.Parameters.AddWithValue("@arid_number", TextBox1.Text);
commandForSP.Parameters.AddWithValue("@DepId", TextBox4.Text);
commandForSP.ExecuteNonQuery();
我的存储过程中列的所有数据类型都与我的数据库表tblDonors
中的相同
答案 0 :(得分:2)
正如@bejger所说,这是因为你正在向contact和depid参数发送字符串而不是int。
但我认为发送String/VARCHAR
列的INT
值是可以接受的,如果它是一个有效的整数,它不会抛出异常。
它在提供时抛出异常String无法转换为Integer。
因此我建议你在将值发送到参数之前使用Int32.TryParse()
方法来执行解析。
Int32.TryParse()
方法返回true,否则返回false。
完整代码:
if(!Int32.TryParse(TextBox2.Text,out var contact))
{
//Error here you can return or display some warning
return;
}
if(!Int32.TryParse(TextBox4.Text,out var depid))
{
//Error here you can return or display some warning
return;
}
SqlCommand commandForSP = new SqlCommand("donateBloodProc",DALobj.openConnection());
commandForSP.CommandType = System.Data.CommandType.StoredProcedure;
commandForSP.Parameters.AddWithValue("@donorName", TextBox1.Text);
commandForSP.Parameters.AddWithValue("@gender", RadioButtonList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@email", TextBox5.Text);
commandForSP.Parameters.AddWithValue("@bloodGroup", DropDownList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@contact_number",contact);
commandForSP.Parameters.AddWithValue("@L_D_D", TextBox3.Text);
commandForSP.Parameters.AddWithValue("@city", DropDownList2.SelectedValue);
commandForSP.Parameters.AddWithValue("@arid_number", TextBox1.Text);
commandForSP.Parameters.AddWithValue("@DepId", depid);
commandForSP.ExecuteNonQuery();
答案 1 :(得分:0)
问题出在这些方面:
commandForSP.Parameters.AddWithValue("@contact_number", TextBox2.Text);
commandForSP.Parameters.AddWithValue("@DepId", TextBox4.Text);
因为您尝试传递字符串值,而您的列是整数类型。 你应该试着这样做:
commandForSP.Parameters.AddWithValue("@contact_number", int.Parse(TextBox2.Text));
commandForSP.Parameters.AddWithValue("@DepId", int.Parse(TextBox4.Text));
虽然要注意这不是完全防错的(因此如果文本框中没有值,它将引发异常)。
总结一下,您的代码将如下所示:
SqlCommand commandForSP = new SqlCommand("donateBloodProc",DALobj.openConnection());
commandForSP.CommandType = System.Data.CommandType.StoredProcedure;
commandForSP.Parameters.AddWithValue("@donorName",TextBox1.Text);
commandForSP.Parameters.AddWithValue("@gender", RadioButtonList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@email", TextBox5.Text);
commandForSP.Parameters.AddWithValue("@bloodGroup",DropDownList1.SelectedValue);
commandForSP.Parameters.AddWithValue("@contact_number", int.Parse(TextBox2.Text));
commandForSP.Parameters.AddWithValue("@L_D_D",TextBox3.Text);
commandForSP.Parameters.AddWithValue("@city", DropDownList2.SelectedValue);
commandForSP.Parameters.AddWithValue("@arid_number", TextBox1.Text);
commandForSP.Parameters.AddWithValue("@DepId", int.Parse(TextBox4.Text));
commandForSP.ExecuteNonQuery();