PC&웹/VS프로그래밍

C#, OLEDB 트랜잭션 업데이트 코드 일부

Simulz™ 2023. 4. 13. 18:31
반응형

개발 환경

  • DB: Access DB
  • 접속자: OLEDB

 

DB 처리 과정을 거꾸로 추적해본다.

여러 Form에서 공통되는 기능은 별도의 메서드로 분리하였다.


SQL Update

최종 호출 메서드

...
public static OleDbConnection DBConn;
public static string DBCONNECT_STRING => string.Concat(new string[]
{
    "Provider=Microsoft.ACE.OLEDB.12.0",
    $";Jet OLEDB:Database Password={SQL_Password}",
    $@";Data Source=""{SQL_Database}"";"
});
...

public static int ExecuteNonQuery(string cmdSqlstr, CommandType cmdType, List<OleDbParameter[]> pars)
{
    int result = 0;

    using (DBConn = new OleDbConnection(DBCONNECT_STRING))
    {
        try
        {
            DBConn.Open();
        }
        catch (Exception ex)
        {
            XtraMessageBox.Show($"{ex.Message}", "ExecuteNonQuery");
        }

        using (OleDbTransaction trans = DBConn.BeginTransaction())
        {
            try
            {
                // 멀티 쿼리 실행
                for (int i = 0; i < pars.Count(); i++)
                {
                    using (OleDbCommand cmd = DBConn.CreateCommand())
                    {
                        cmd.Transaction = trans;
                        cmd.CommandType = cmdType;
                        cmd.CommandText = cmdSqlstr;
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddRange(pars[i]);
                        Debug.WriteLine(cmdSqlstr);

                        result = cmd.ExecuteNonQuery();
                        Debug.WriteLine($"result: {result}");
                    }
                }
                // 커밋
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
                XtraMessageBox.Show($"{ex.Message}", "ExecuteNonQuery");
                return 0;
            }
        }
    }
    return result;
}

트랜잭션을 사용하므로 trans.Commit(); 줄에서 최종적으로 DB Update가 된다.

넘겨 받은 pars 매개변수의 요소수 만큼, result = cmd.ExecuteNonQuery(); 줄에서 임시 업데이트가 된다.
도중에 오류가 발생하면 catch로 넘어가고, trans.Rollback();에 의해, 임시 업데이트된 기록이 취소/복구 된다.

트랜잭션은 한 번에 여러 레코드나 테이블을 작업할 때 필수.

A 계좌에서 돈을 빼내고(ExecuteNonQuery), B 계좌로 입금을 하기 직전에 오류가 발생하면 돈이 증발해버리므로
Rollback을 통해 다시 A계좌의 돈을 복구하는 것이 트랜잭션 기능.

ExecuteNonQuery를 호출한 메서드

internal int Update(Item[] items)
{
    int result = 0;
    try
    {
        List<OleDbParameter[]> @params = new();
        foreach (var item in items)
        {
            @params.Add(ItemToParameter(item));
        }
        result = OleDBHelper.ExecuteNonQuery(sql.Update, CommandType.Text, @params);
    }
    catch
    {
        throw;
    }
    return result;
}

파라미터 컬렉션을 넘겨주는 메서드이다.

OleDbParameter[] ItemToParameter(Item[]) 메서드는 파라미터 배열을 만들어준다.

OleDbParameter[] @params = new OleDbParameter[]
{
    new OleDbParameter("@TRSORTID", item.TRSORTID.OleDbType, item.TRSORTID.DbSize)
    {
        Value = item.TRSORTID.DbValue
    },
     new OleDbParameter("@TRDATE", item.TRDATE.OleDbType)
    {
        Value = item.TRDATE.DbValue
    },
};

OleDbParameter 매개변수에 값을 직접 쓰면 관리가 어려워서 item 클래스에 묶어놨다. 클래스 구조는 비밀 ㅎㅎ


Update를 호출한 메서드

int UpdateDB(Item[] items)
{
    int result = -1;
    try
    {
        result = dac.Update(items);
    }
    catch (OleDbException ex)
    {
        XtraMessageBox.Show($"{ex.Message}", "UpdateDB", DevExpress.Utils.DefaultBoolean.True);
    }
    return result;
}

if문에서 호출되므로 별도의 메서드로 만들었다.


UpdateDB를 호출한 메서드

public bool Data_Save(bool isExit = false)
{
    List<Item> items = new();
    items.Add(new Item());
	...Your Self...
    
    if (DB삽입이면)
    {
    }
    else
    {
        // 폼 값을 데이터 보관 클래스에 저장
        ...Your Self...
        // 데이터 유효성 검사
        ...Your Self...
        // Cell 값을 DB에 저장
        if (UpdateDB(items.ToArray()) == -1)
        {
            return false;
        }
        // Cell 값을 DataRow에 저장
        if (!UpdateDataRow(items[0]))
        {
            return false;
        }
        return true;
    }
}

DB 삽입, 수정에 따라 데이터를 확인, 넘겨주는 메서드이다.


Data_Save를 호출한 메서드

internal bool view_Save()
{
    if (Data_Save())
    {
        DataEventHandler.InvokeTransactionChanged(this);
        return true;
    }
    return false;
}

데이터 저장을 성공하면 이벤트를 발생시키는 메서드이다.
폼 클래스에서 해당 이벤트를 구독하는데, 이벤트를 수신하면 그리드 등의 데이터가 갱신된다.


view_Save를 호출한 메서드

사용자가 저장 버튼을 누르면 실행되는 이벤트핸들이다.

private void Button_Save_Click(object sender, EventArgs e)
{
    if (view_Save())
    {
	...저장 완료 시 처리할 코드...
    }
}

이 화면에서 저장 버튼을 누르면 호출되는 메서드이다.

반응형