我在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时转换失败。”
答案 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)