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();
}
}