簡體   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