【发布时间】:2015-11-13 20:52:07
【问题描述】:
我正在学习一个在线课程,在课程中他们解释了如何从数据库中检索数据。创建连接和命令由DbProviderFactories 类完成。我了解课程中的代码,但是否使用using 进行必要的连接、命令和阅读器?另外,是否有必要进行空检查?代码看起来很杂乱,如果您的数据库中有很多模型(大陆、国家、货币……),则需要大量复制/粘贴,这很糟糕吗?
所以问题真的是,下面的代码是好是坏,还有哪些可以改进的地方?目标是使用 SQLite 作为数据库提供者。这适用于以下方法吗?
public static ObservableCollection<Continent> GetContinents()
{
var continents = new ObservableCollection<Continent>();
var provider = ConfigurationManager.ConnectionStrings["DbConnection"].ProviderName;
var connectionString = ConfigurationManager.ConnectionStrings["DbConnection"].ConnectionString;
using (var connection = DbProviderFactories.GetFactory(provider).CreateConnection())
{
if (connection == null) return null;
connection.ConnectionString = connectionString;
connection.Open();
using (var command = DbProviderFactories.GetFactory(provider).CreateCommand())
{
if (command == null) return null;
command.CommandType = CommandType.Text;
command.Connection = connection;
command.CommandText = "SELECT * FROM Continent";
using (var reader = command.ExecuteReader())
while (reader.Read())
continents.Add(new Continent(reader["Code"].ToString(), reader["EnglishName"].ToString()));
}
}
return continents;
}
【问题讨论】:
-
你为什么认为它需要大量的复制粘贴。首先你的 CommandText 应该作为变量/参数传递给你决定
code for re-use的任何方法@更改方法签名处理诸如 SqlCommand、SqlParameter 等的事情。 using 语句用于自动处理对象,请尝试使用MSDN并对您的目标进行更多研究,以便您可以了解在线课程之外的事情是如何工作的现实世界。 -
还有更简单的方法可以在您自己的自定义 DBUtils 类中执行您想要执行的操作..
-
你可以在这里消除while循环并使用
DataAdapter.FIll()方法将内容返回到DataTable你的代码需要一些严肃的Re-Factoring
标签: c# sqlite database-connection factory using