为所有程序或单个C#制作数据访问类

时间:2018-11-14 15:28:20

标签: c# sql sql-server data-access

因此标题有点含糊,但问题确实是这样的:实际上最好是创建一个数据访问类,在这种情况下,是访问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数据库中访问和写入数据。在这种情况下通常会做什么?

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

关于数据访问,有很多(不是冲突)的,但有不同的看法,我真的是想看看哪种做法更常见。

2 个答案:

答案 0 :(得分:3)

我不同意特里,因为:

连接为pooled,因此打开/关闭连接不是问题,并且您不想使用单个连接来执行多个并发查询。当有多个并发线程(例如Web服务器)时,这非常有用,但这也适用于普通应用程序(可能使用Tasks在单独的线程上检索数据以保持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 Injection

答案 1 :(得分:1)

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