c# - 连接数据库的完美方式?

标签 c# sql-server connection

public class SqlHelper
{
public SqlHelper()
{
}
public static SqlConnection GetConnection()
{
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" +     System.Web.HttpContext.Current.Server.MapPath(@"~\App_Data\learn.mdf") + ";Integrated Security=True;User Instance=True";
    return conn;
}
public static SqlDataReader ExecuteReader(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    SqlDataReader dr = null;
    try
    {
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch
    {
        con.Close();
        return null;
    }
    return dr;
}
public static Object ExecuteScalar(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    Object val = null;
    try
    {
        val = cmd.ExecuteScalar();
    }
    catch
    {
        con.Close();
        return null;
    }
    finally
    {
        con.Close();
    }
    return val;

}
public static DataSet ExecuteDataSet(string sql)
{
    SqlConnection con = GetConnection();
    SqlCommand cmd = new SqlCommand(sql, con);
    DataSet ds = new DataSet();
    SqlDataAdapter adapt = new SqlDataAdapter(cmd);
    try
    {
        adapt.Fill(ds);
    }
    catch
    {
        con.Close();
    }
    return ds;
}
public static void ExecuteNonQuery(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    try
    {
        cmd.ExecuteNonQuery();
    }
    finally
    {
        con.Close();
    }
}
}

这是我用来实现对我的数据库的每次访问的类。但我认为我与数据库连接的方式有点夸张,因为每次我需要某些东西时我都必须点击连接功能。以及其他用户也会做同样的事情,这会降低性能。
那么连接数据库的最佳方式是什么——如果更好的话保持连接。注意我在很多页面都用到了数据库!
谢谢

最佳答案

首先,您应该使用“using”语句来确保在发生故障时正确处理所有 ADO.NET 对象:

public static void ExecuteNonQuery(string sql) 
{     
    using(var con = GetConnection())
    {
        con.Open();     
        using(var cmd = new SqlCommand(sql, con))
        {         
            cmd.ExecuteNonQuery();     
        }     
    }
}

不过,话虽如此,我并没有真正看到这种方法有什么问题。优点是每次执行一些 SQL 时,连接、命令、适配器和诸如此类的东西都会被正确处理。如果您要创建单个静态 SqlConnection 实例,则会增加连接已在使用中的可能性(例如,当迭代 SqlDataReader 的内容时)。

如果您真的担心它,请提供将连接作为额外参数的重载:

public static void ExecuteNonQuery(string sql, SqlConnection connection) 
{     
    using(var cmd = new SqlCommand(sql, con))
    {         
        cmd.ExecuteNonQuery();     
    }     
}

这样,调用者可以执行一些不需要多次调用的 SQL,或者他们可以调用您的 GetConnectionMethod 来获取连接,并将其传递给多个调用。

关于c# - 连接数据库的完美方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5091867/

相关文章:

sql-server - 连接到 SQL Server(从 Ubuntu): [RubyODBC] Cannot allocate SQLHENV

amazon-web-services - 将 PySpark 连接到 AWS Redshift 时出错

c# - WPF-组合框选择已更改显示最后选择的项目而不是当前项目

c# - 在C#中动态调用不同的C DLL

php - PDO 不读取 MSSQL Server 的 nvarchar 数据类型

php数据库连接到Access

php - 为什么我不断收到错误 500 (mySQL)?

c# - 在 View 状态中存储控件的自定义属性

c# - 如何创建 nim dll 并从 C# 调用它

c# - 将 Sum 列与另一列相乘