我正在做一个项目,我希望mysql和msql兼容。一切正常,但我有一个关于代码重复的小问题:
对于所有数据库查询,我有一个单独的类,对于selects,我执行以下操作(例如对象“profil”):
我有一个参数“ismysql”,如果我想使用mysql,我将其设置为true,如果我想使用microsoftsqlserver,我将其设置为false。
public Profil Select_profil(string query)
{
Profil profil = new Profil();
if (this.OpenConnection() == true)
{
if (this.isMySQL)
{
MySqlCommand cmd = new MySqlCommand(query.Replace("[myDataBase].", ""), connection);
using (MySqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
profil.ID = Int32.Parse(dataReader["ID"].ToString().Trim());
profil.Nom = dataReader["PROFIL"].ToString().Trim();
profil.Famille = dataReader["FAMILLE"].ToString().Trim();
profil.Largeur = double.Parse(dataReader["LARGEUR"].ToString().Trim());
profil.Hauteur = double.Parse(dataReader["LARGEUR_AILE"].ToString().Trim());
profil.EpAile = double.Parse(dataReader["EP_AILE"].ToString().Trim());
profil.EpAme = double.Parse(dataReader["EP_AME"].ToString().Trim());
profil.Radius1 = double.Parse(dataReader["R"].ToString().Trim());
profil.Radius2 = double.Parse(dataReader["R2"].ToString().Trim());
profil.PdsLin = double.Parse(dataReader["PDS_LINEAIRE"].ToString().Trim());
profil.PaintSurf = double.Parse(dataReader["PAINT_SURF"].ToString().Trim());
profil.P08 = double.Parse(dataReader["P08"].ToString().Trim());
profil.P09 = double.Parse(dataReader["P09"].ToString().Trim());
profil.P10 = double.Parse(dataReader["P10"].ToString().Trim());
profil.P11 = double.Parse(dataReader["P11"].ToString().Trim());
}
}
}
else
{
SqlCommand cmd = new SqlCommand(query, MSconnection);
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
profil.ID = Int32.Parse(dataReader["ID"].ToString().Trim());
profil.Nom = dataReader["PROFIL"].ToString().Trim();
profil.Famille = dataReader["FAMILLE"].ToString().Trim();
profil.Largeur = double.Parse(dataReader["LARGEUR"].ToString().Trim());
profil.Hauteur = double.Parse(dataReader["LARGEUR_AILE"].ToString().Trim());
profil.EpAile = double.Parse(dataReader["EP_AILE"].ToString().Trim());
profil.EpAme = double.Parse(dataReader["EP_AME"].ToString().Trim());
profil.Radius1 = double.Parse(dataReader["R"].ToString().Trim());
profil.Radius2 = double.Parse(dataReader["R2"].ToString().Trim());
profil.PdsLin = double.Parse(dataReader["PDS_LINEAIRE"].ToString().Trim());
profil.PaintSurf = double.Parse(dataReader["PAINT_SURF"].ToString().Trim());
profil.P08 = double.Parse(dataReader["P08"].ToString().Trim());
profil.P09 = double.Parse(dataReader["P09"].ToString().Trim());
profil.P10 = double.Parse(dataReader["P10"].ToString().Trim());
profil.P11 = double.Parse(dataReader["P11"].ToString().Trim());
}
}
}
this.CloseConnection();
}
return profil;
}
对于mysql和sqlserver,代码是相同的(除了在mysql中替换的[mydatabase]),但是我需要重复两次,因为在一种情况下我使用objects mysqlcommand和mysqldatareader,在第二种情况下我需要使用sqlcommand和sqldatareader。不方便的是,当我在我的数据库中进行一些修改时,我需要全部更改两次(错误的来源)。有没有一种方法可以将代码分组并放置一次,而不使用函数?
3条答案
按热度按时间bvn4nwqk1#
感谢zacs的解决方案,我把代码放在这里:
那么executereader函数:
关于connection和msconnection,有两个私有对象:
kupeojn62#
而不是在if..else。。语句,您应该为数据访问编写一个单独的层,如前面的注解中所建议的。该层将处理数据库选择和其他操作。
例如,添加一个契约,比如icommand——这将在当前代码中代替mysqlcommand或sqlcommand。数据访问层将有一个工厂/类和函数,它将根据参数返回相应的命令。
类似地,您在业务层的代码中可能正在执行的所有其他与数据库相关的操作都将移动到您将创建的新层dataaccesslayer。
编辑:感谢@richardissimo和@siegfried.v接受这个答案。正如建议的,我把代码放在这里,这样你就可以接受它作为一个答案。
jljoyd4f3#
如果希望使用不同的数据库引擎并从设置中选择某个特定安装中的一个,则应该有一个数据访问层,该层实现可选数据库引擎的接口。为此,一种选择是拥有一个抽象类并从中继承,以实现每个数据库引擎的特性。有一个工厂示例化所需的实现并使用它。