“将数据类型nvarchar转换为int时出错。”执行存储过程

时间:2014-02-15 08:11:08

标签: c# asp.net sql-server asp.net-mvc stored-procedures

我有一个存储过程,当从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中的相同

2 个答案:

答案 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();