大家好,我是这里的新人。我目前正在制作一个asp.net项目监控模块。此时我正在编辑项目表单并向项目中的选定任务添加资源。
我在保存记录方面遇到了问题。我每次保存记录都说
"列名或提供的值数与表不匹配 。定义"
在我的ProjectTasks表中,我有RefNo(PK),TaskID(FK),名称和描述
名称 - 指任务名称
描述 - 参考任务描述
我想要发生的是当我点击保存按钮时我的资源表任务ID(FK)将被更新。截至目前,当我从任务中添加资源时,TaskID = 0。
protected void btnSave_Click(object sender, EventArgs e)
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO ProjectTasks VALUES (@Name, @Description); " +
"SELECT TOP 1 TaskID FROM ProjectTasks ORDER BY TaskID DESC;";
cmd.Parameters.AddWithValue("@Name", txtName.Text);
cmd.Parameters.AddWithValue("@Description", txtDescription.Text);
int taskID = (int)cmd.ExecuteScalar();
con.Close();
con.Open();
cmd.CommandText = @"UPDATE Resource_Materials SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Equipments SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Vehicles SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Contractors SET TaskID=@TaskID WHERE TaskID=0;";
cmd.Parameters.AddWithValue("@TaskID", taskID);
cmd.ExecuteNonQuery();
con.Close();
Helper.AddLog("1", "Add", "Assigned Resources to Task");
Response.Redirect("~/Projects/Default.aspx");
}
对我的语法表示抱歉我只是一名学生。
答案 0 :(得分:0)
你说
ProjectTasks表我有RefNo(PK),TaskID(FK),名称和描述
在这种情况下,您的INSERT
查询应该如下所示,指定您尝试插入值的确切列名称,以及您在当前插入查询中缺少TaskID(FK)
列
INSERT INTO ProjectTasks(TaskID, Name, Description)
VALUES (@TaskID, @Name, @Description);
答案 1 :(得分:0)
你的逻辑具有误导性。
您的ProjectTasks有4列,但您尝试在insert语句中插入2列值,而不会在表名为ProjectTasks (Name, Description)
之后声明它们。
但是这仍然会产生问题,因为你的第一列是PK而第二列是FK。由于FK可以为空,但据我所知PK不能为空,这就是你需要重新考虑插入逻辑的原因。
但即使你修复它,你的代码仍然有问题。由于您为CommandText
媒体资源设置了新字符串,因此@Name
和@Description
参数仍然属于您的cmd
对象。这就是为什么在ExecuteNonQuery
行,您的cmd
将有3个参数@Name
,@Description
和@TaskID
,但您的命令只有1个参数。如您所见,您将收到错误,例如; 您提供的参数和命令不匹配或其他内容。在这种情况下,在设置新CommandText
或生成新的SqlCommand对象cmd = new SqlCommand()
之前,您需要Clear()
参数
还可以使用using
statement自动处理您的连接和命令,而不是手动调用.Close()
或.Dispose()
方法。
不再使用AddWithValue
方法了。 It may generate unexpected results sometimes。使用Add
方法重载来指定参数类型及其大小。
答案 2 :(得分:0)
在insert语句中,当我们不想为所有列指定值时,我们需要提供列名。如果我们不这样做,我们需要所有列的供应值。 在您的情况下,您只想为名称和描述提供值,以便您可以执行以下操作:
INSERT INTO ProjectTasks(Name, Description) VALUES (@Name, @Description);
答案 3 :(得分:0)
通过删除ExecuteScalar并将INSERT语句替换为UPDATE语句来解决它。
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "UPDATE ProjectTasks SET Name=@Name, Description=@Description " +
"WHERE TaskID=@TaskID; " +
"SELECT TOP 1 TaskID FROM ProjectTasks ORDER BY TaskID DESC;";
cmd.Parameters.AddWithValue("@Name", txtName.Text);
cmd.Parameters.AddWithValue("@Description", txtDescription.Text);
cmd.Parameters.AddWithValue("@TaskID", Request.QueryString["ID"].ToString());
cmd.CommandText = @"UPDATE Resource_Materials SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Equipments SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Vehicles SET TaskID=@TaskID WHERE TaskID=0; " +
"UPDATE Resource_Contractors SET TaskID=@TaskID WHERE TaskID=0;";
cmd.ExecuteNonQuery();
con.Close();
Helper.AddLog("1", "Add", "Assigned Resources to Task");
Response.Redirect("~/Projects/Default.aspx");