为所有程序或单个 C# 进行数据访问 class
Making a data access class for all programs or individual C#
所以标题有点含糊,但问题确实是这样的:实际上最好是进行数据访问 class,在这种情况下访问 SQL 服务器。
class 的所有静态方法都需要连接字符串和 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();
}
然后是一个执行类似操作的方法,除了它 returns 您查询的数据。
或者在实践中,为您正在构建的特定应用程序创建一个 object 并将这些项目编码为 objects 扩展是否更好。因此 SQL 到 运行 或要执行的存储过程将包含在 class.
中
obj.GetSomethingViaQueryThatIsWrittenInTheClassLibrary()
所以我猜第一个更像是一个服务库,用于在 SQL 服务器数据库中访问和写入数据。在这种情况下,人们通常会做什么?
或者您甚至可以将服务库与 objects 库一起使用吗?
关于数据访问有大量的,并不冲突,但不同的意见,我真的想看看什么是更常见的做法。
我不会在这样的 sql 执行方法中创建、打开和关闭连接。相反,我建议在每次需要查询时创建连接并将其传递给查询方法,并在所有查询完成后关闭连接。
我不同意特里的观点,因为:
连接数为 pooled,因此 opening/closing 连接数不是问题,您不想使用单个连接来执行多个并发查询。这在有许多并发线程(例如网络服务器)时非常有用,但这也适用于普通应用程序(可能使用任务在单独的线程上检索数据以保持 UI 响应)
所以我会创建一个 ConnectionManager class,它使用连接字符串作为构造函数参数,这样连接字符串就不会 'travel' 通过您的程序并封装在 'manager'目的。
这是一个糟糕的例子,但我认为它在使用 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 to prevent SQL Injection
所以标题有点含糊,但问题确实是这样的:实际上最好是进行数据访问 class,在这种情况下访问 SQL 服务器。
class 的所有静态方法都需要连接字符串和 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();
}
然后是一个执行类似操作的方法,除了它 returns 您查询的数据。
或者在实践中,为您正在构建的特定应用程序创建一个 object 并将这些项目编码为 objects 扩展是否更好。因此 SQL 到 运行 或要执行的存储过程将包含在 class.
中 obj.GetSomethingViaQueryThatIsWrittenInTheClassLibrary()
所以我猜第一个更像是一个服务库,用于在 SQL 服务器数据库中访问和写入数据。在这种情况下,人们通常会做什么?
或者您甚至可以将服务库与 objects 库一起使用吗?
关于数据访问有大量的,并不冲突,但不同的意见,我真的想看看什么是更常见的做法。
我不会在这样的 sql 执行方法中创建、打开和关闭连接。相反,我建议在每次需要查询时创建连接并将其传递给查询方法,并在所有查询完成后关闭连接。
我不同意特里的观点,因为:
连接数为 pooled,因此 opening/closing 连接数不是问题,您不想使用单个连接来执行多个并发查询。这在有许多并发线程(例如网络服务器)时非常有用,但这也适用于普通应用程序(可能使用任务在单独的线程上检索数据以保持 UI 响应)
所以我会创建一个 ConnectionManager class,它使用连接字符串作为构造函数参数,这样连接字符串就不会 'travel' 通过您的程序并封装在 'manager'目的。
这是一个糟糕的例子,但我认为它在使用 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 to prevent SQL Injection