Я разрабатываю приложение, которое вначале будет подключено к базе данных Access, и в ближайшем будущем планируется перейти на MS SQL или SQL Express. Структуры datatables одинаковы для обоих типов баз данных, и я пытаюсь избежать дублирования кода и пытаюсь найти способ минимизировать код.
Например, я написал следующую функцию для извлечения данных из базы данных Access:
public static DataTable GetActiveCalls()
{
string select = "SELECT call_id, call_time, msisdn, status FROM call WHERE status = 0 OR status = 1 ORDER by call_id ASC";
OleDbCommand cmd = new OleDbCommand(select, conn);
DataTable dt = new DataTable("Active Calls");
OleDbDataAdapter DA = new OleDbDataAdapter(cmd);
try
{
conn.Open();
DA.Fill(dt);
}
catch (Exception ex)
{
string sDummy = ex.ToString();
}
finally
{
conn.Close();
}
return dt;
}
и следующий код для базы данных SQL Express:
public static DataTable GetActiveCalls()
{
string select = "SELECT call_id, call_time, msisdn, status FROM call WHERE status = 0 OR status = 1 ORDER by call_id ASC";
SqlCommand cmd = new SqlCommand(select, conn);
DataTable dt = new DataTable("Active Calls");
SqlDataAdapter DA = new SqlDataAdapter(cmd);
try
{
conn.Open();
DA.Fill(dt);
}
catch (Exception ex)
{
string sDummy = ex.ToString();
}
finally
{
conn.Close();
}
return dt;
}
Эти два метода почти одинаковы. Единственными отличиями являются SqlCommand / OleDbCommand и SqlDataAdapter / OleDbDataAdapter.
Есть также несколько методов, которые принимают аргументы, например:
public static void AddMessage(string callID, string content)
{
string select =
"INSERT INTO message(key, direction, content, read, write_time) VALUES (@callId, 0, @content, 0, @insertTime)";
OleDbCommand cmd = new OleDbCommand(select, conn);
cmd.Parameters.AddWithValue("callId", callID.ToString());
cmd.Parameters.AddWithValue("content", content);
cmd.Parameters.AddWithValue("insertTime", DateTime.Now.ToString());
try
{
conn.Open();
cmd.ExecuteScalar();
}
catch (Exception ex)
{
string sDummy = ex.ToString();
}
finally
{
conn.Close();
}
}
В этом случае строка запроса SQL также одинакова для обеих баз данных, но есть разница между типом cmd (SqlCommand / OleDbCommand).
Буду очень признателен, если кто-нибудь подскажет, как избежать дублирования кода и оптимизировать данную проблему.