为所有程序或单个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数据库中的数据。在这种情况下,人们通常会做什么?

或者,您甚至可以将服务库与对象库一起使用吗?

关于数据访问,有很多不同的意见,但并不矛盾,我真的在努力看看什么是更常见的做法。

我不同意Terry的观点,因为:

连接是池化的,因此打开/关闭连接不是问题,并且您不希望使用单个连接来执行多个并发查询。当有许多并发线程(例如Web服务器(时,这是非常有用的,但这也适用于普通应用程序(可能使用任务在单独的线程上检索数据以保持UI响应(

因此,我将创建一个ConnectionManager类,该类使用连接字符串作为构造函数参数,这样连接字符串就不会在程序中"传播",而是封装在"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以防止SQL注入

我不会在这样的sql执行方法中创建、打开和关闭连接。相反,我建议创建连接,并在每次需要查询时将其传递给查询方法,当所有查询完成时,关闭连接。

相关内容

  • 没有找到相关文章

最新更新