与一对多关系更新数据库中的问题

问题描述 投票:0回答:1

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

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;
sql asp.net database oledb
1个回答
0
投票

欢迎使用堆栈溢出。

问题出在您的更新语句中。您在参数名称周围用单引号引起来。这意味着它们被解释为文字字符串,而不是参数名称。因此,您的语句告诉数据库使用值'@ 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+ "'";
© www.soinside.com 2019 - 2024. All rights reserved.