以一对多关系更新数据库时出现问题

我正在尝试更新数据库,但是出现此错误:

  

system.web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.Data.OleDb.OleDbException:您无法添加或更改记录,因为表'ItemTypes'中需要相关记录。

我不确定该如何解决。

我不知道需要显示什么,所以我将只显示大部分内容。

我试图寻找一种解决方案,发现的解决方案说这是因为我试图使用不同的值来更新字段,但我不明白为什么,因为该字段是假定的保持一致。

The databases I have the problem with

这是html部分:

<asp:DropDownList ID="ItemType" runat="server">
    <asp:ListItem></asp:ListItem>
</asp:DropDownList></td>

这是我在PageLoad中的代码:

if (!Page.IsPostBack)
{
    DataTable dtItem = s.GetItemByIdForUser(Session["ItemCode"].ToString(),Session["Name"].ToString());
    ItemCode.Text = dtItem.Rows[0][0].ToString();
    ItemName.Text = dtItem.Rows[0][1].ToString();
    ItemDes.Text = dtItem.Rows[0][2].ToString();
    DataTable Types = s.GetallItemsTypes();
    for (int i = 0; i < Types.Rows.Count; i++)
        ItemType.Items.Add(Types.Rows[i][0].ToString());
    ItemType.SelectedItem.Text = dtItem.Rows[0][3].ToString();
    ItemPrice.Text = dtItem.Rows[0][4].ToString();
    Stock.Text = dtItem.Rows[0][5].ToString();
    SellerName.Text = dtItem.Rows[0][6].ToString();
    Image1.ImageUrl = "~/ProjectPictures/" + dtItem.Rows[0][8].ToString();
}

这是我单击更新时发生的代码:

DataTable dtItem = s.GetItemByIdForUser(Session["ItemCode"].ToString(),Session["Name"].ToString());
i.ItemCode = ItemCode.Text;
i.Name = ItemName.Text;
i.Des = ItemDes.Text;
i.Type = ItemType.SelectedItem.ToString();
i.Price = ItemPrice.Text;
i.Stock = Stock.Text;
i.username = SellerName.Text;
if (Pic.HasFile)
{
    Pic.SaveAs(Server.MapPath("ProjectPictures/") + Pic.FileName);
    i.Pic = Pic.FileName;
}
else
{
    i.Pic = dtItem.Rows[0][8].ToString();
}
s.UpdateItem(i,ItemCode.Text);
Session["ItemCode"] = null;
Response.Redirect("Main.aspx");

这是sql语句

string sql = "UPDATE [Items] SET [ItemName]= '@p1',[ItemDes] = '@p2',[ItemType] = '@p3',[Price] = '@p4',[Stock] = '@p5',[ItemPic] = '@p6' where [ItemCode] = '" +itemCode+ "'";
OleDbCommand cmd = new OleDbCommand(sql);
cmd.Parameters.Add(new OleDbParameter("@p1",OleDbType.VarChar));
cmd.Parameters["@p1"].Value = i.Name;
cmd.Parameters.Add(new OleDbParameter("@p2",OleDbType.VarChar));
cmd.Parameters["@p2"].Value = i.Des;
cmd.Parameters.Add(new OleDbParameter("@p3",OleDbType.VarChar));
cmd.Parameters["@p3"].Value = i.Type;
cmd.Parameters.Add(new OleDbParameter("@p4",OleDbType.VarChar));
cmd.Parameters["@p4"].Value = i.Price;
cmd.Parameters.Add(new OleDbParameter("@p5",OleDbType.VarChar));
cmd.Parameters["@p5"].Value = i.Stock;
cmd.Parameters.Add(new OleDbParameter("@p6",OleDbType.VarChar));
cmd.Parameters["@p6"].Value = i.Pic;
ningruohai1 回答:以一对多关系更新数据库时出现问题

问题出在您的更新语句中。您在参数名称周围用单引号引起来。这意味着它们被解释为文字字符串,而不是参数名称。因此,您的语句告诉数据库使用值'@ p3'(而不是ItemTypes表中的值,因此违反外键)更新ItemType,而不用参数中的值更新。实际上,您的参数已被完全忽略。

还请记住,使用OleDB时会忽略参数名称。重要的是您以正确的顺序提供了参数。

将您的sql更改为此:

string sql = "UPDATE [Items] SET [ItemName]= @p1,[ItemDes] = @p2,[ItemType] = @p3,[Price] = @p4,[Stock] = @p5,[ItemPic] = @p6 where [ItemCode] = '" +itemCode+ "'";
本文链接:https://www.f2er.com/3045901.html

大家都在问