【问题标题】:How can I update and insert value on my Foreign Key Column?如何在外键列上更新和插入值?
【发布时间】:2018-09-05 07:41:51
【问题描述】:

我想插入和更新我的表格。我的查询语句仅指示主键、项目名称、描述、价格等。问题是我还有另一列是 FOREIGN KEY。当我尝试将值插入到我的项目数据库表中时,发生了错误。它说列数与第 1 行的值数不匹配。如果我有 FOREIGN KEY 列,我该如何更新表?

class Item
    {
        public int ItemID { get; set; }
        public string ItemName { get; set; }
        public string Description { get; set; }
        public string Price { get; set; }
        public string Stocks { get; set; }

        public int GenerateID()
        {
            int newID = 0;
            Connection connection = new Connection();
            string sql = "SELECT ItemID FROM tbl_Item ORDER BY ItemID DESC Limit 1";
            MySqlConnection conn = new MySqlConnection(connection.ConnectionString);
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            conn.Open();
            MySqlDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                dr.Read();
                newID = dr.GetInt32("ItemID");
            }
            conn.Close();
            newID++;
            return newID;
        }

        public void UpdateRecord()
        {
            try
            {
                Connection connection = new Connection();
                string sql = "UPDATE Item SET ItemName=@itemName, Description=@desc, Price=@price, Stocks=@stocks WHERE ItemID=@itemId";
                MySqlConnection conn = new MySqlConnection(connection.ConnectionString);
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@itemId", ItemID);
                cmd.Parameters.AddWithValue("@itemName", ItemName);
                cmd.Parameters.AddWithValue("@desc", Description);
                cmd.Parameters.AddWithValue("@price", Price);
                cmd.Parameters.AddWithValue("@stocks", Stocks);

                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                MessageBox.Show("Update Successfully", "Update Record", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception e)
            {
                MessageBox.Show("An error occured: " + e, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void InsertRecord()
        {
            Connection connection = new Connection();
            try
            {
                string sql = "INSERT INTO tbl_Account VALUES(@itemId, @itemName, @desc, @price, @stocks)";
                MySqlConnection conn = new MySqlConnection(connection.ConnectionString);
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@itemId", ItemID);
                cmd.Parameters.AddWithValue("@itemName", ItemName);
                cmd.Parameters.AddWithValue("@desc", Description);
                cmd.Parameters.AddWithValue("@price", Price);
                cmd.Parameters.AddWithValue("@stocks", Stocks);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();

                MessageBox.Show("Update Successfully", "Update Record", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception e)
            {
                MessageBox.Show("An error occurred: " + e, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
//for button ADD
private void btnAddItem_Click(object sender, EventArgs e)
        {
            Item item = new Item();

            item.ItemID = item.GenerateID();
            item.ItemName = txtINameItem.Text;
            item.Description = txtDescriptionItem.Text;
            item.Price = txtPriceItem.Text;
            item.Stocks = textStocksItem.Text;

            item.InsertRecord();
        }

【问题讨论】:

  • 当您编写插入语句而不指定接收值的列时,假定您为所有列提供值。您的表 tbl_Account 的架构是什么?此外,如果您在此表中有 FK,则需要提供与关系中外部表的键匹配的值
  • 如果您在未指定列名的情况下使用 Insert into,则需要在表中包含所有列的数据。你说你有另一个带有外键的列,所以你需要将它包含到你的插入中。或者在插入中指定列。
  • 顺便说一句,在他更新代码中,您使用名为 Item 的表,而在插入代码中,您有 tbl_Account
  • 我需要为外键创建另一个 generateID 吗?我输入了错误的表名,即 tbl_Item 而不是 tbl_Account
  • 我还需要为我的 FOREIGN KEY 声明一个属性,例如 public int ForeignID { get;放; }

标签: c# oop


【解决方案1】:

您的 SQL 代码错误。插入记录时必须传递有效的外键值。有效外键值是父表中已经存在的值或 NULL。但是,将 NULL 设置为外键列取决于您在子表上创建外键的方式。

试试下面的代码,用子表和值中正确的外键列顺序替换 @fkValue 和 FkValue:

                string sql = "INSERT INTO tbl_Account VALUES(@itemId, @fkValue, @itemName, @desc, @price, @stocks)";
                MySqlConnection conn = new MySqlConnection(connection.ConnectionString);
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@itemId", ItemID);
                cmd.Parameters.AddWithValue("@fkValue", FkValue);
                cmd.Parameters.AddWithValue("@itemName", ItemName);
                cmd.Parameters.AddWithValue("@desc", Description);
                cmd.Parameters.AddWithValue("@price", Price);
                cmd.Parameters.AddWithValue("@stocks", Stocks);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多