【发布时间】:2018-12-13 10:46:49
【问题描述】:
我正在开发一个希望 MySQL 和 MSQL 兼容的项目。 一切正常,但我有一个关于代码重复的小问题:
我对所有数据库查询都有一个单独的类,对于选择,我执行以下操作(例如对象“Profil”):
我有一个参数“isMySQL”,如果我想使用 MySQL,我将其设置为 true,如果我想使用 Microsoft SQL Server,我将其设置为 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 和 SQL Server,代码是相同的(除了 [MyDatabase].,我在 MySQL 的情况下替换),但我需要重复两次,因为在一种情况下我使用对象 MySqlCommand 和 MySqlDataReader,在第二种情况下我需要使用 SqlCommand 和 SqlDataReader。 不方便的是,当我在数据库中进行一些修改时,我需要全部更改两次(错误来源)。 有没有办法将代码分组并放置一次,而不使用函数?
【问题讨论】:
-
我已经使用 System.Data.Common.DbCommand(不是 SqlCommand,不是 mysqlCommand)完成了这项工作——我唯一改变的是连接字符串和创建我的连接对象的核心工厂 x.OpenConnection( )。我在存储过程背后隐藏了许多其他问题,并在极少数情况下动态更改原始 sql 语法。 MySql 和 SqlServer 库甚至没有在主数据层中引用。 DbCommand 抽象接口摆脱了您看到的 IF ELSE 问题,
-
感谢您的建议,我想我将从 System.Data.Common.DbCommand 开始,这似乎是我的起点。您能否提供一些有关如何使用它的示例的链接,因为目前找不到太多关于它的信息。
-
@Siegfried.V 而不是编辑您的问题以包含答案,您应该添加自己的答案,您可以接受。
-
@Richardissimo,好的,我会这样做,我只是相信我可以接受 zac 的回答,因为他给了我解决方案。
-
@Richardissimo 我明白了。事实上,我犹豫是否将 zac 答案标记为好答案,但正如您也评论的那样,它不像 cmets 那样清楚。所以我会等待他编辑他的答案以将其标记为解决方案,然后删除我的。对他更公平,因为他是给我解决方案的人。感谢您的评论。
标签: c# mysql sql-server database