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

时间:2016-07-28 14:50:05

标签: c#

我在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;
                }


            }

        }
    }

上面的函数是用于Ms Access中的执行查询对象的一些参数,该代码适用于我的项目,但我遇到“代码样式”的问题。

我想更改代码,所以当我有另一个查询与另一个不同的参数我不需要重写该代码(请参阅参数,查询名称和数据库文件名称是“硬编码”功能)。 / p>

任何建议和C#代码都会有所帮助。

2 个答案:

答案 0 :(得分:0)

你是对的,你会想要重构它以使其更通用化。不经常改变的一件事是连接字符串。也许你可以把它抽象成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一起使用的一些提示,请参阅How to use Entity framework for MS Access database。或者你可以找到任何其他类型的ORM(对象/关系映射器)

答案 1 :(得分:-2)

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;
            }
        }
    }
}