c# - 为所有程序或单个 C# 创建数据访问类
问题描述
所以标题有点含糊,但问题实际上是这样的:在实践中最好创建一个数据访问类,在这种情况下访问 SQL Server。
哪里类的所有静态方法都需要连接字符串和SQL语句?
这些方面的东西:
public static void ExecuteSql(string connStr, string strSqlStatement)
{
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand cmd = new SqlCommand(strSqlStatement, conn);
cmd.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
然后是一个执行类似操作的方法,除了它返回您查询的数据。
或者在实践中,为您正在构建的特定应用程序创建一个对象,并将这些项目编码为对象扩展是否更好。因此,要运行的 SQL 或要执行的存储过程将包含在该类中。
obj.GetSomethingViaQueryThatIsWrittenInTheClassLibrary()
所以我猜第一个更像是一个服务库,用于在 SQL Server 数据库中访问和写入数据。在这种情况下,人们通常会做什么?
或者您甚至可以将服务库与对象库一起使用吗?
关于数据访问有很多,不冲突,但不同的意见,我真的想看看什么是更常见的做法。
解决方案
我不同意特里,因为:
连接是pooled的,因此打开/关闭连接不是问题,并且您不想使用单个连接来执行多个并发查询。这在有许多并发线程(例如网络服务器)时非常有用,但这也适用于普通应用程序(可能使用任务在单独的线程上检索数据以保持 UI 响应)
因此,我将创建一个 ConnectionManager 类,该类使用连接字符串作为构造函数参数,这样连接字符串就不会“穿过”您的程序,而是封装在“管理器”对象中。
这是一个糟糕的例子,但我认为在使用 ADO.NET 时它工作得很好
public class ConnectionManager
{
private string _connectionString;
public ConnectionManager(string connectionString)
{
_connectionString = connectionString;
}
public SqlConnection GetConnection()
{
return new SqlConnection(_connectionString);
}
}
然后我会使用它:
var connectionManager = new ConnectionManager(connectionString);
using(var con = connectionManager.GetConnection())
{
// not all operations require .Open()/.Close()
// multiple queries.
}
using(var con = connectionManager.GetConnection())
{
// not all operations require .Open()/.Close()
// multiple other queries.
}
通过使用using
连接将被释放(放回池中)
你甚至可以使用类似的东西:
public class ConnectionManager
{
private string _connectionString;
public ConnectionManager(string connectionString)
{
_connectionString = connectionString;
}
public void ExecuteNonQuery(string strSqlStatement)
{
using(var connection = new SqlConnection(_connectionString))
using(var command = new SqlCommand(strSqlStatement, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
}
这使得:
var connectionManager = new ConnectionManager(connectionString);
connectionManager.ExecuteNonQuery("SELECT * FROM Whatever");
提示:您肯定需要检查SqlParameter以防止SQL 注入
推荐阅读
- scala - Slick in Scala - 在这个实现中在哪里包含方法创建、更新、删除?
- python - 是否可以在没有 python 模块的情况下模拟按键?
- css - 如何使用媒体查询使 div 根据屏幕的高度/宽度显示/消失?
- ios - 在启用“内容视图”的 UICollectionViewCell 中,顶部、底部、左侧和右侧的“添加新约束”被禁用(灰显)
- javascript - Google Apps Script Web App POST“简单请求”莫名其妙地失败了 CORS 预检
- flutter - 如何在同一数据上同时使用两个不同的包
- python - 在 Anaconda for Python 3.6 中执行命令时遇到问题
- mongoose - 连接到集群并切换到另一个数据库
- kotlin - Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)
- javascript - 多维数组上的数组映射