最初は Access データベースに接続するアプリケーションを開発しており、近い将来に MS SQL または SQL Express に切り替える予定です。データテーブル構造は両方のタイプのデータベースで同じであり、コードの重複を避け、コードを最小限に抑える方法を見つけようとしています。
たとえば、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;
}
この 2 つの方法はほとんど同じです。唯一の違いは、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) に違いがあります。
コードの重複を回避し、特定の問題を最適化する方法について誰かが提案してくれれば、本当に感謝しています。