Call multiple SQL Server stored procedures in a transaction

后端 未结 3 996
太阳男子
太阳男子 2020-12-31 08:23

For usage in my current project I\'ve created a class that allows me to call SQL Server async.

My code looks like this:

internal class CommandAndCall         


        
3条回答
  •  旧巷少年郎
    2020-12-31 09:12

    public class Command
    {
        public string sql { get; set; }
        public CommandType cmdType { get; set; }
        public Dictionary parameter { get; set; } = null;
    }
    
        private Command insertInvoice(Invoice invoice)
        {
            try
            {
                Dictionary parameterLocal = new Dictionary();
    
                parameterLocal.Add("p_customerId", invoice.customerId);
                parameterLocal.Add("p_invoiceNo", invoice.invoiceNo);
                parameterLocal.Add("p_invoiceDate", invoice.invoiceDate);
                parameterLocal.Add("p_invoiceAmount", invoice.invoiceAmount);                
                parameterLocal.Add("p_withInvoice", invoice.withInvoice);
    
                return (new Command { sql = "sp_insertInvoice", cmdType = CommandType.StoredProcedure, parameter = parameterLocal });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
        private Command insertInvoiceModel(InvoiceModel invoiceModel)
        {
            try
            {
                Dictionary parameterLocal = new Dictionary();
    
                parameterLocal.Add("p_invoiceNo", invoiceModel.invoiceNo);
                parameterLocal.Add("p_model", invoiceModel.model);
                parameterLocal.Add("p_quantity", invoiceModel.quantity);
                parameterLocal.Add("p_unitPrice", invoiceModel.unitPrice);
    
                return (new Command { sql = "sp_insertInvoiceModel", cmdType = CommandType.StoredProcedure, parameter = parameterLocal });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
     List commandList = new List();
    
     cmd = insertInvoice(invoicesave);
    
     commandList.Add(cmd);
    
     cmd = insertInvoiceModel(invoiceModelSave);
    
     commandList.Add(cmd);
    
            try
            {
                erplibmain.erpDac.runOleDbTransaction(commandList);
            }
            catch (Exception ex)
            {
                throw ex;
            }
    
        public void runOleDbTransaction(List commandList)
        {
            OleDbConnection erpConnection = new OleDbConnection(ErpDalMain.connectionstring);
            erpConnection.Open();
    
            OleDbCommand erpCommand = erpConnection.CreateCommand();
            OleDbTransaction erpTrans;
    
            // Start a local transaction
            erpTrans = erpConnection.BeginTransaction();
            // Assign transaction object for a pending local transaction
            erpCommand.Connection = erpConnection;
            erpCommand.Transaction = erpTrans;
    
            try
            {
                foreach (Command cmd in commandList)
                {
                    erpCommand.CommandText = cmd.sql;
                    erpCommand.CommandType = cmd.cmdType;
    
                    foreach (KeyValuePair entry in cmd.parameter)
                    {
                        erpCommand.Parameters.AddWithValue(entry.Key, entry.Value);
                    }
    
                    erpCommand.ExecuteNonQuery();
    
                    erpCommand.Parameters.Clear();
                }
    
                erpTrans.Commit();
            }
            catch (Exception e)
            {
                try
                {
                    erpTrans.Rollback();
                }
                catch (OleDbException ex)
                {
                    if (erpTrans.Connection != null)
                    {
                        throw ex;
                    }
                }
    
                throw e;
            }
            finally
            {
                erpConnection.Close();
            }
        }
    

提交回复
热议问题