在ExecuteNonQuery中将nvarchar转换为int时出错

时间:2014-12-09 13:57:16

标签: asp.net

我在asp.net中收到以下程序的错误。
我检查过sql,名字是nvarchar。

{
    con.Open();
    SqlCommand cmd = new SqlCommand("bookinsertion2", con);
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    cmd.Parameters.AddWithValue("@idnumber",txtid.Text);
    cmd.Parameters.AddWithValue("@name", txtname.Text);
    cmd.Parameters.AddWithValue("@year", txtyear.Text);
    cmd.Parameters.AddWithValue("@department", txtdepart.Text);
    cmd.Parameters.AddWithValue("@bookname", ddlbookavail.SelectedItem.ToString());

    cmd.ExecuteNonQuery();       
    con.Close();
    Response.Redirect("~/LendingForm2.aspx");
} 

这是存储过程的代码

create Procedure [dbo].[bookinsertion2]
@idnumber int,
@name nvarchar(20),
@year int,  
@department nvarchar(30),
@bookname nvarchar(25)
as
Begin
   insert into tbllendinginfo values(@idnumber,@name,@year,@department,@bookname)
   insert into tbllendinginfo(Dateofbooktaken) values(GETDATE())
   update tblbookinfo set BooksAvailable=BooksAvailable-(select COUNT(Id) from tbllendinginfo where BookName=@bookname) where Name=@bookname
end

错误是“将nvarchar值'Mike'转换为数据类型int时转换失败。”

1 个答案:

答案 0 :(得分:0)

错误消息是明确的,存储过程所期望的一个或多个参数不是nvarchar类型。可能@year和@idnumber参数是一个整数。如果那是真的那么你需要打电话

   cmd.Parameters.AddWithValue("@idnumber",Convert.ToInt32(txtid.Text));
   cmd.Parameters.AddWithValue("@year", Convert.ToInt32(txtyear.Text));

说,如果可能的话,请尝试避免调用AddWithValue,特别是在涉及字符串或日期的情况下。 AddWithValue根据输入值确定参数的类型,并且大部分时间都是正确的,但是在某些情况下,它会决定错误的数据类型并且很难找到错误。此外,带字符串的AddWithValue是一个性能障碍 在这两篇文章中可以找到更好的解释。

Can we stop using AddWithValue() already?
How Data Access Code Affects Database Performance

您可以使用Object Initializer语法

重写上面的代码
{
    con.Open();
    SqlCommand cmd = new SqlCommand("bookinsertion2", con);
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    cmd.Parameters.Add( 
         new SqlParameter
         { 
             ParameterName = "@idnumber", 
             SqlDbType = SqlDbType.Int, 
             Value = Convert.ToInt32(txtid.Text)
         });
    cmd.Parameters.Add( 
         new SqlParameter
         { 
             ParameterName = "@name", 
             SqlDbType = SqlDbType.NVarChar, 
             Size = 50,
             Value = txtname.Text
         });
    cmd.Parameters.Add( 
         new SqlParameter
         { 
             ParameterName = "@year", 
             SqlDbType = SqlDbType.Int, 
             Value = Convert.ToInt32(txtyear.Text)
         });
    cmd.Parameters.Add( 
         new SqlParameter
         { 
             ParameterName = "@department", 
             SqlDbType = SqlDbType.NVarChar, 
             Size = 50,
             Value = txtdepart.Text
         });
    cmd.Parameters.Add( 
         new SqlParameter
         { 
             ParameterName = "@bookname", 
             SqlDbType = SqlDbType.NVarChar, 
             Size = 50,
             Value = ddlbookavail.SelectedItem.ToString()
         });

    cmd.ExecuteNonQuery();       
    con.Close();
    Response.Redirect("~/LendingForm2.aspx");
} 

修改
编辑后我认为问题出在存储过程的这一行:

insert into tbllendinginfo values(@idnumber,@name,@year,@department,@bookname)

您尚未指定列的名称,只指定了参数。因此,服务器按照数据表中列的定义顺序插入参数 当然,如果表中的第二列不是应该接收@name参数的列,则可能会出现严重问题。

您可以使用相同的顺序修复列出列名称的问题,将参数放在VALUES子句中,或者更改参数的顺序以遵循列名的顺序。

例如(我不知道列名,所以你应该修复它们)

insert into tbllendinginfo (idnumber, name, bookyear, department, bookname) 
                           values(@idnumber,@name,@year,@department,@bookname)