C#-改变”;硬“-编码样式为可重用代码

本文关键字:样式 代码 编码 改变 C#- | 更新日期: 2023-09-27 17:59:02

我的C#项目上有这个函数

public DataTable access2dt()
    {
        string myConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb";
        using (var con = new OleDbConnection(myConnectionString))
        {
            con.Open();
            using (var cmd = new OleDbCommand("EXEC OUTBOUND_FILTER",con))
            {
                cmd.Parameters.AddWithValue("prmORIGINCODE", "BDO");
                cmd.Parameters.AddWithValue("prmORIGIN", "'"*'"");
                cmd.Parameters.AddWithValue("prmSERVICECODE", "REG15");
                cmd.Parameters.AddWithValue("prmDESTCODE", "AMI");
                cmd.Parameters.AddWithValue("prmDESTINATION", "'"*'"");
                using (OleDbDataReader rdr = cmd.ExecuteReader())
                {
                    DataTable myTable = new DataTable();
                    myTable.Load(rdr);
                    return myTable;
                }

            }
        }
    }

上面的函数是用一些参数在MsAccess中执行查询对象的,代码只适用于我的项目,但我对"代码样式"有问题。

我想更改代码,这样当我有另一个带有另一个不同参数的查询时,我不需要重写该代码(请参阅参数、查询名称和数据库文件名是"硬编码"的)。

任何建议和C#代码都将非常有用。

C#-改变”;硬“-编码样式为可重用代码

您想重构它以使其更加通用,这是正确的。有一件事不会经常更改,那就是连接字符串。也许您可以将其抽象为DataStore类。然后您可以有一个ExecuteCommand方法,该方法采用命令名称和参数:

public class DataStore
{
    private string _connectionStr;
    public DataStore(string connectionStr)
    {
        this._connectionStr = connectionStr;
    }
    public DataTable ExecuteCommand(string commandText, IDictionary<string,string> parameters)
    {
        using (var connection = new OleDbConnection(this._connectionStr))
        {
            connection.Open();
            using (var cmd = new OleDbCommand(commandText, con))
            {
                foreach (var pair in parameters)
                {
                    cmd.Parameters.AddWithValue(pair.Key, pair.Value);
                }
                using (var reader = cmd.ExecuteReader())
                {
                    var table = new DataTable();
                    table.Load(reader);
                    return table;
                }
            }
        }
    }
}

但这仍然有一些限制,比如每个参数值都必须是一个字符串。您可以将parameters更改为IDictionary<string, object>,但这样会失去良好的类型安全性。

退一步看,您可能会想象许多开发人员在将数据库访问封装在抽象层中时也有同样的困难,并且可能已经解决了这个问题。事实上,像Dapper和Entity Framework这样的东西可以为您做这类事情。

有关如何将实体框架与MS Access一起使用的一些提示,请参阅如何使用MS Access数据库的实体框架。或者,您可以查找任何其他类型的ORM(对象/关系映射器)

public DataTable access2dt(string filename, string namaQuery, IDictionary<string,string> keyValue)
{
    string myConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb";
    using (var con = new OleDbConnection(myConnectionString))
    {
        con.Open();
        using (var cmd = new OleDbCommand("EXEC OUTBOUND_FILTER",con))
        {
            foreach (var d in keyValue)
            {
                cmd.Parameters.AddWithValue(d.Key, d.Value);
            }
            using (OleDbDataReader rdr = cmd.ExecuteReader())
            {
                DataTable myTable = new DataTable();
                myTable.Load(rdr);
                return myTable;
            }
        }
    }
}