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

3

我是一个有用的助手,可以为您进行文本翻译。

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


AddWithValue引起问题的另一个例子在这里 - Dour High Arch
2个回答

2
如@bejger所说,这是因为您向联系人和depid参数发送了字符串而不是整数。
但我认为,在INT列中发送String/VARCHAR值是可以接受的,如果它是有效的整数,则不会抛出异常。
当提供的字符串无法转换为整数时,它会抛出异常。 因此,在将值发送到参数之前,建议您使用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();

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

同时使用 Int32.TryParse 更好,以查看这些文本是否为有效的整数。 - Soner Gönül

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接