C#问题中的SQLTransaction

Mkhurram92.

成员
加入
3月12日,2021年
消息
5
编程经验
Beginner
大家好,

我有一种在数据库中存储值的方法,然后是打印发票之后。我正在为发票打印打印表格。我想确保如果它保存它应该打印。否则回滚所有的脉冲。以下是方法的Symtex。
  1. databaseaddedupdatebarcodesalestoday:
    private void DatabaseAddedUpdateBarcodeSalesToday()
    {
        sqlConnection.Open();
        sqlTransaction = sqlConnection.BeginTransaction();
        try
        {
            AddToDatabase();
            sqlTransaction.Commit();
        }
        catch (Exception exp)
        {
            MesageBox.Show(exp.Message.ToString(), "Transaction Failed");
            sqlTransaction.Rollback();
        }
    }
addtodatabase()正在销售表中保存值。之后它是调用方法printInvoice();

AddToDatabase():
private void AddToDatabase()
{
    sqlCommand = new SqlCommand("Insert Into Sales(barcode_id,customer_id, pos_id,qty)values(@barcode_id,@customer_id, (Select id From POS Where [email protected]),@qty); 
    sqlCommand.Parameters.AddWithValue("@barcode_id", temp_barcode);
    sqlCommand.Parameters.AddWithValue("@customer_id", 1);
    sqlCommand.Parameters.AddWithValue("@qty", 1);
    sqlDataReader = sqlCommand.ExecuteReader();
    sqlDataReader.Close();
  }

这是printinvoice方法
printInvoice():
private void printInvoice()
{
       Invoice invi = new Invoice();
       invi.invi_barcode = temp_barcode;
       invi.user_id = userId;
       invi.Show();
}
另一方面,发票我有一种方法在相同的交易期间正在更新销售表。在该方法上,我的程序被绞死并给了我超时错误。这是发票上的方法


UpdateBarcode:
     private void UpdateBarcode(string p, string strI){
                try{
                     sqlCommandInvoice = new SqlCommand("Update Sales Set mgroupId = @mGroup Where Barcode_Id = @Barcode_Id", sqlConnectionInvoice);
                     sqlCommandInvoice.Parameters.AddWithValue("@mGroup", strI);
                     sqlCommandInvoice.Parameters.AddWithValue("@Barcode_Id", p);
        
                     sqlConnectionInvoice.Open();
                     sqlDataReaderInvoice = sqlCommandInvoice.ExecuteReader();
                     sqlDataReaderInvoice.Close();
                     sqlConnectionInvoice.Close();
        
                     BARCODE_UPDATE = true;
                 }
                 catch (Exception exp)
                 {
                     MessageBox.Show(exp.Message.ToString(), "Error");
                 }
是否有任何其他方法可以在没有任何问题的情况下实现这一目标?

提前致谢,


问候,
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,860
地点
切萨皮克,va.
编程经验
10+
我尚未仔细调查,但我有几个问题:

1. Why are you calling ExecuteReader() instead of ExecuteNonQuery() to perform the UPDATE?
2. What SqlConnection is being used by AddToDatabase()?
3. Why are you not setting the @name parameter in AddToDatabase()?
4. Why do you even need a transaction for a single INSERT? All modern databases provide ACID operations, so that INSERT operation will be atomic.
 
Last edited:

Mkhurram92.

成员
加入
3月12日,2021年
消息
5
编程经验
Beginner
我尚未仔细调查,但我有几个问题:

1. Why are you calling ExecuteReader() instead of ExecuteNonQuery() to perform the UPDATE?
2. What SqlConnection is being used by AddToDatabase()?
3. Why are you not setting the @name parameter in AddToDatabase()?
4. Why do you even need a transaction for a single INSERT? All modern databases provide ACID operations, so that INSERT operation will be atomic.

感谢您的答复。

1:我不清楚executereader和executenonquery的差异。刚刚在谷歌上班,你是对的,我必须使用executenonquery,我已经调整了它。再次感谢这一点。

2:addtodatabase是一种形式1,我正在使用SQLConnection。虽然UpdateBarCode在表单2上并在该表单上使用不同的SQLConnection。
3:对不起,它是一个拼写错误,我在参数中使用@name。
4:我在addtodatabase中有多种方法
  1. generatebarcodetemp("Barcode") --->从存储在表中的下一个Avaialble条形码序列获取值
  2. getCustomerType()--->获取当前客户类型
  3. printinvoice()--->差异形式印刷也有多种方法。
  4. UpdateQty(数量,ID)--->根据其ID和类型更新客户数量。
在发票表单上也有多种方法......
  1. Vatchecker()--->检查增值税的值
  2. updateBarCode(String p,string stri)--->使用Barcod更新销售额
所有方法都应使用一种转换来满足我的要求。
 
Last edited:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,701
地点
悉尼,澳大利亚
编程经验
10+
2:addtodatabase是一种形式1,我正在使用SQLConnection。虽然UpdateBarCode在表单2上并在该表单上使用不同的SQLConnection。
Then your data access code is poorly designed and you're all but stuffed because a SqlTransaction is specific to a SqlConnection so you cannot use a single transaction across multiple connections. You could use a distributed transaction but that would be a complex solution to a problem of your own making. The appropriate solution would be to redesign your data access code so that related operations take place together, over the same connection. That might be as simple as allowing an existing connection to be passed into that AddToDatabase method but I fear that there's more to fix than that.
 

Mkhurram92.

成员
加入
3月12日,2021年
消息
5
编程经验
Beginner
您在这种类型的程序中的正常方法是什么。这是一个具有不同销售方法的POS。实际上我们拥有超过100万客户。在特定时间持续时间内,我们为每个客户提供特定数量的产品。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,701
地点
悉尼,澳大利亚
编程经验
10+
如果您有一个调用表单和一个被称为表单,并且发生相关的数据访问,则应该以一种形式或另一个形式完成,而不是折叠两者。如果没有关于应用程序的信息,难以更具体的信息,这可能不适合这里。

还有可能创建专用数据访问层(DAL)。然后,您可以能够创建一个可以在表单之间传递并在两者之间传递的专用DAL对象的实例,从而为数据访问创建单个点,从而使用单个连接对象的能力。
 

Mkhurram92.

成员
加入
3月12日,2021年
消息
5
编程经验
Beginner
如果您有一个调用表单和一个被称为表单,并且发生相关的数据访问,则应该以一种形式或另一个形式完成,而不是折叠两者。如果没有关于应用程序的信息,难以更具体的信息,这可能不适合这里。

还有可能创建专用数据访问层(DAL)。然后,您可以能够创建一个可以在表单之间传递并在两者之间传递的专用DAL对象的实例,从而为数据访问创建单个点,从而使用单个连接对象的能力。
谢谢你。您建议的DAL的任何教程或指南?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,701
地点
悉尼,澳大利亚
编程经验
10+
最佳 底部