반응형
개발 환경
- 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())
{
...저장 완료 시 처리할 코드...
}
}
이 화면에서 저장 버튼을 누르면 호출되는 메서드이다.
반응형