sql - 更新具有一对多关系的数据库时出现问题

标签 sql asp.net database oledb

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

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.OleDb.OleDbException: You cannot add or change a record because a related record is required in table '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;

最佳答案

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

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

把你的sql改成这样:

string sql = "UPDATE [Items] SET [ItemName]= @p1 , [ItemDes] = @p2 , [ItemType] = @p3 , [Price] = @p4 , [Stock] = @p5, [ItemPic] = @p6 where [ItemCode] = '" +itemCode+ "'";

关于sql - 更新具有一对多关系的数据库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007554/

相关文章:

android - ContentProvider android权限

php - 使用下拉列表选择 php mysql 数据库的结果创建新的下拉列表

php - 过滤数据库值

mysql - SQL 在一列中选择多个值,具有不同的条件

java - 如果记录仅存在 13 个月,则检查数据库

MySQL:什么是临时表?

asp.net - 如何在 ASP.NET MVC 网站上执行定期工作?

sql - 你如何记录你的数据库结构?

ASP.NET 和 System.Diagnostics 跟踪 - 我是否遗漏了什么,或者这是一个坏主意?

javascript - 在 asp.net 中的 GridView 或数据表中动态添加新行?