繁体   English   中英

如何避免为不同类型编写相同的代码

[英]How to avoid writing same code for different types

我正在使用 SQL 服务器和 SQL 服务器 CE 编写 C# 程序。 如何避免编写如下相同的代码,变量databasestate用于查看程序是否应该使用 SQL 服务器或 SQL 服务器 CE。

public static void Delete()
{
    SqlCeCommand commce = new SqlCeCommand("Delete From Projekat WHERE IDProjekat = @ConID", conce);

    SqlCommand comm = new SqlCommand("Delete From Projekat WHERE IDProjekat = @ConID", con);

    if (CrossFormData.databasestate == false)
    {
        commce.Parameters.AddWithValue("@ConID", CrossFormData.ProjectID);

        try
        {
            conce.Open();
            commce.ExecuteNonQuery();
            conce.Close();

            MessageBox.Show("Deleted!");
        }
        catch (Exception)
        {
            MessageBox.Show("Something went wrong");
            conce.Close();
        }
    }
    else
    {
        comm.Parameters.AddWithValue("@ConID", CrossFormData.ProjectID);

        try
        {
            con.Open();
            comm.ExecuteNonQuery();
            con.Close();

            MessageBox.Show("Deleted!");
        }
        catch (Exception)
        {
            MessageBox.Show("Something went wrong");
            con.Close();
        }
    }
}

如果使用 SQL 服务器 CE 让你生气,对不起,下次我将使用 SQLite。

如果我找不到方法,我会将它们分成两个不同的类,这样会更有条理。

SqlCeCommandSqlCommand都派生自DbCommand ,因此针对基础 class 进行编程:

var connection = CrossFormData.databasestate ? (DbConnection) con : conce;
using var command = connection.CreateCommand();
command.CommandText = "Delete From Projekat WHERE IDProjekat = @ConID";
command.Parameters.AddWithValue("@ConID", CrossFormData.ProjectID);

try
{
    connection.Open();
    command.ExecuteNonQuery();
    MessageBox.Show("Deleted!");
}
catch (DbException)
{
    MessageBox.Show("Something went wrong");
}
finally
{
    connection.Close();
}

更好的是,使用Dapper之类的帮助程序库来消除很多这样的样板:

var connection = CrossFormData.databasestate ? (DbConnection) con : conce;
connection.Execute("Delete From Projekat WHERE IDProjekat = @ConID", new { ConID = CrossFormData.ProjectID });

我看不出分成两个类如何解决重复代码的问题,但这是一个起点:SqlCeCommand 和 SqlCommand 都派生自 DbCommand,因此如果您可以使用命令的输入参数(作为 DbCommand)重写代码无论是哪种情况,它都应该起作用。 此外,从我收集的内容来看,con 和 conce 应该是相同的 class 或共享父 class,因此希望不应该成为问题。 我也查找了使用的方法,它们都来自 DbCommand。 祝你好运,如果您需要更多信息,请告诉我(或者我可以编写一些代码来向您展示我的意思,我现在只是在吃饭,哈哈)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM