c#通过在数据库增加一个记录失败,并显示异常,参数化查询 '(@birthDay datetime' 需要参数 '@address',但未提供该参数。

chenmulove 2015-12-09 10:17:27
//数据库访问根据操作返回结果
public int DataQuaryTwo(string sql, SqlParameter[] parms)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = getConn();
cmd.CommandText = sql;
foreach (SqlParameter parameter in parms)
{
cmd.Parameters.Add(parameter);
}
return cmd.ExecuteNonQuery();
}

//方法:添加一条学生的记录
public string addStuMess(StuMess stu){

string sql = "insert into tb_student values (@no,@name,@sex,@birthDay,@party,@dept,@prof,@stuClass,@address)"; //"insert into tb_student values"
SqlParameter[] parms = { new SqlParameter("@no", SqlDbType.Char, 50), new SqlParameter("@name", SqlDbType.VarChar, 50), new SqlParameter("@sex", SqlDbType.Char, 50), new SqlParameter("@birthDay", SqlDbType.DateTime, 50), new SqlParameter("@party", SqlDbType.VarChar, 50), new SqlParameter("@dept", SqlDbType.VarChar, 50), new SqlParameter("@prof", SqlDbType.VarChar, 50), new SqlParameter("@stuClass", SqlDbType.VarChar, 50), new SqlParameter("@address", SqlDbType.VarChar, 50) };
parms[0].Value = stu.Id;
parms[1].Value = stu.StuName;
parms[2].Value = stu.Sex;
parms[3].Value = stu.Birthday;
parms[4].Value = stu.Party;
parms[5].Value = stu.Dept;
parms[6].Value = stu.Prof;
parms[7].Value = stu.Cla;
parms[8].Value = stu.Family_adress;
// da.Update(ds.Tables["students"]);
// ds.Tables["students"].AcceptChanges();

int result=db.DataQuaryTwo(sql,parms);
if(result >0){
return "学生信息添加成功";

}
else{
return "学生信息添加失败";

}
}


//展示层:一个添加学生的按钮事件
private void btnAdd_Click(object sender, EventArgs e)
{

Student.StuMess student = new Student.StuMess();
student.Id = txtId.Text.Trim();
student.StuName = txtName.Text.Trim();

string sex;
if (this.radBoy.Checked == true)
{
sex = "男";
}
else
{
sex = "女";
}


student.Sex = sex;

DateTime dateB = Convert.ToDateTime(datBirthday.Text.Trim());
Console.WriteLine( dateB);
student.Birthday = dateB;
student.Party = cmbParty.Text.Trim();
student.Dept = cmbDept.Text.Trim();
student.Prof = cmbProf.Text.Trim();
student.Cla = cmbClass.Text.Trim();
string result = student_bll.addStuMess(student);
if (result == "学生信息添加成功")
{
MessageBox.Show("学生信息添加成功");
}
else if (result == "学生信息添加失败")
{
MessageBox.Show("学生信息添加失败");
}


System.Data.SqlClient.SqlException: 参数化查询 '(@no char(50),@name varchar(50),@sex char(50),@birthDay datetime' 需要参数 '@address',但未提供该参数。
...全文
142 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenmulove 2015-12-10
  • 打赏
  • 举报
回复
找到原因了,值从按钮那边传过来的值,DataQuaryTwo这个函数的parms数组接收不到familyadress的值,它的sqlValue为null,这是为什么?
清江堤畔 2015-12-10
  • 打赏
  • 举报
回复
student.Family_adress 未赋值,string 类型未赋值是 null ,不是空字符串。null 要转 DbNull,如1楼版主所说。
juhuatai111 2015-12-10
  • 打赏
  • 举报
回复
btnAdd_Click事件中,没有给familyadress赋值,而且如果familyadress是tring类型,实例化后默认是空字符,而不是null,检查一下
chenmulove 2015-12-09
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
直接传入null值的话,SqlParameter不会被传入SQL,要用DBNull来代替
DBNULL是什么属性吗?
chenmulove 2015-12-09
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
加个这样的判断
/// <summary>  
/// 如果当前值为null,则返回DbNull,以防止Sql参数不被传递的问题  
/// </summary>  
/// <param name="obj"></param>  
/// <returns></returns>  
public static object GetDbNullWhileNull(this object obj)
{
    if (obj == null)
    {
        return DBNull.Value;
    }
    return obj;
} 
为什么要用到这个判断呢?我在按钮这边的事件都有赋值给数据字段啊?
  • 打赏
  • 举报
回复
直接传入null值的话,SqlParameter不会被传入SQL,要用DBNull来代替
  • 打赏
  • 举报
回复
加个这样的判断
/// <summary>  
/// 如果当前值为null,则返回DbNull,以防止Sql参数不被传递的问题  
/// </summary>  
/// <param name="obj"></param>  
/// <returns></returns>  
public static object GetDbNullWhileNull(this object obj)
{
    if (obj == null)
    {
        return DBNull.Value;
    }
    return obj;
} 

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧