更新记录时出错

时间:2015-06-28 13:06:17

标签: c# asp.net sql-server insert-update

大家好,我是这里的新人。我目前正在制作一个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");
}

对我的语法表示抱歉我只是一名学生。

4 个答案:

答案 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");