我正在开发一个应用程序,一开始将连接到 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;
}
这两种方法几乎相同。唯一的区别是 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)有所不同。
如果有人能就如何避免重复代码和优化给定问题提出任何建议,我将不胜感激。