C# 插入的值对第二个查询不可见

C# 插入的值对第二个查询不可见,c#,mysql,C#,Mysql,有两个表客户发票和已售出项目详细信息 在客户发票表中有一列,客户发票id(主键) 此客户库存id是已售出商品详细信息的外键 这是我对代码的抽象看法 public void txtRent_PreviewKeyDown(object sender, KeyEventArgs e){ /* This method will Insert values to the customer_invoice table */ CreateOrder(); /* This meth

有两个表客户发票已售出项目详细信息

  • 在客户发票表中有一列,客户发票id(主键)
  • 客户库存id是已售出商品详细信息的外键
这是我对代码的抽象看法

public void txtRent_PreviewKeyDown(object sender, KeyEventArgs e){

    /* This method will Insert values to the customer_invoice table */
    CreateOrder();

   /* This method will Insert values to the sold_item_details table*/
   InsertOrderItem(OrderItem orderItem);
}
这是我在执行插入查询时遇到的问题。第二个查询引发MysqlException的无法添加或更新子行。我在CreateOrder()和inserordItem()之间进行了检查,检查插入过程是否意外完成,结果是否成功

例如,如果我使用cus\u inv\u id=1插入值集,它将被插入到表customer\u invoice中,但当使用cus\u inv\u id(FK)=1插入到表中时,它会引发该异常

这是与这两种方法相关的两个代码。(为了解决问题,我删除了一些列)




在createorder中,您准备了一个要添加到发票的查询,但从未运行该查询。所以,不会是这样的there@BugFinder对不起,我错了,我没有在问题中包含那个代码。如果我检查CreateOrder()和InsertOrderItem中间的值是否已发送到数据库,则该代码将运行良好。@LahiruJ请提供完整的异常消息,以及异常中可用的所有信息,以及“无法添加或更新子行”以外的任何详细信息。@LahiruJ,请添加加载/创建
OrderItem
对象所缺少的代码。此外,还缺少其他变量,如
customerId
。请提供您拥有的完整源代码。在createorder中,您准备了一个要添加到发票中的查询,但从未运行该查询。所以,不会是这样的there@BugFinder对不起,我错了,我没有在问题中包含那个代码。如果我检查CreateOrder()和InsertOrderItem中间的值是否已发送到数据库,则该代码将运行良好。@LahiruJ请提供完整的异常消息,以及异常中可用的所有信息,以及“无法添加或更新子行”以外的任何详细信息。@LahiruJ,请添加加载/创建
OrderItem
对象所缺少的代码。此外,还缺少其他变量,如
customerId
。请提供您拥有的完整源代码。
public void CreateOrder()
    {
       _connection.open();
        var mysqlTrans = _connection.BeginTransaction();
        var orderId = -1;
        MySqlDataReader sqlDataReader;

        try
        {
            const string query =
                "SELECT cus_inv_id FROM customer_invoice " +
                "WHERE customer_id = @cusId";

            var mysqlCommand1 = new MySqlCommand(query, _connection, mysqlTrans);
            mysqlCommand1.Parameters.AddWithValue("@cusId", customerId);
            sqlDataReader = mysqlCommand1.ExecuteReader();

            if (sqlDataReader.HasRows)
            {
                sqlDataReader.Read();
                orderId = (int) sqlDataReader["cus_inv_id"];
            }
            sqlDataReader.Close();

            if (orderId == -1)
            {
                var mysqlCommand2 = _connection.CreateCommand();
                mysqlCommand2.Connection = _connection;
                mysqlCommand2.Transaction = mysqlTrans;

                mysqlCommand2.CommandText = "SELECT MAX(cus_inv_id) FROM customer_invoice " +
                                            "HAVING MAX(cus_inv_id) IS NOT NULL";

                sqlDataReader = mysqlCommand2.ExecuteReader();
                if (sqlDataReader.Read())
                {
                    orderId = (int) sqlDataReader["MAX(cus_inv_id)"] + 1;
                }
                else
                {
                    orderId += 2; 
                }

                sqlDataReader.Close();

                mysqlCommand2.CommandText =
                    "INSERT INTO customer_invoice(cus_inv_id)" +
                    " VALUES(@cusInvId)";

                mysqlCommand2.Parameters.AddWithValue("@cusInvId", orderId);
                mysqlCommand2.ExecuteNonQuery();
            }
            mysqlTrans.Commit();
            _connection.close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex);
            mysqlTrans.Rollback();
        }
    }
 public void InsertOrderItem(OrderItem orderItem)
    {
        _connection.open();
        var mysqlCommand = _connection.CreateCommand();
        var mysqlTrans = _connection.BeginTransaction();
        mysqlCommand.Connection = _connection;
        mysqlCommand.Transaction = mysqlTrans;
        try
        {
            mysqlCommand.CommandText = "SELECT MAX(sold_item_id) FROM sold_item_details " +
                                       "HAVING MAX(sold_item_id) IS NOT NULL";

            var sqlDataReader = mysqlCommand.ExecuteReader();
            var lastSoldItemId = 1;
            if (sqlDataReader.Read())
            {
                lastSoldItemId = (int) sqlDataReader["MAX(sold_item_id)"] +1;
            }

            sqlDataReader.Close();

            mysqlCommand.CommandText = "INSERT INTO sold_item_details(sold_item_id,cus_inv_id) VALUES(@soldItemId, @cusInvId)";

            mysqlCommand.Parameters.AddWithValue("@soldItemId", lastSoldItemId);

            mysqlCommand.Parameters.AddWithValue("@cusInvId", orderItem.OrderId);

            mysqlCommand.ExecuteNonQuery();
            mysqlTrans.Commit();
            _connection.close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            mysqlTrans.Rollback();
        }
    }