连接数据库的完美方式?

时间:2011-02-23 13:59:29

标签: 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();
    }
}
}

这是我用来实现对数据库的每次访问的类。但我认为我与数据库建立连接的方式有点过分,因为每次我需要的时候都必须点击连接功能。和其他用户一样,这会杀死性能。
那么连接数据库的最佳方式是什么 - 如果更好的话,保持联系。请注意,我在很多页面中使用数据库! 感谢

5 个答案:

答案 0 :(得分:4)

首先,您应该使用“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来获取连接,并将其传递给多个调用。

答案 1 :(得分:0)

如果这是用于网站,那么你必须考虑在页面请求之间,即使是在同一个浏览器中,你的服务器状态也会被拆除(一般来说),所以没有什么可以从维护页面之间的SQL连接。这是第一件事。

如果每个页面都是单个数据库连接的结果,那么您可能已经根据实际需要进行了优化,如果您在页面生成中建立多个连接,那么您可能希望查看保持连接活动状态直到你完成检索数据;通过维护连接或优化数据检索来限制应用程序和数据库之间的来回。

答案 2 :(得分:0)

维护数据库连接是连接池的工作,而不是连接使用者。最佳做法是尽可能晚地获取连接并尽快释放。

using(var connection = new SqlConnection(YourConnectionStringHelperFunction())
{

}

答案 3 :(得分:0)

你可能会考虑的一件事是Dependency Injection PAttern和一些IoC控制器。如果每个页面都需要有这个连接,那么这就是一个可注入的属性(构造函数可能不会工作,除非你实现某种类型的基础结构类,如Request)使用一些容器(Unity,Castle,StructureMap)打包所需的东西(也许是缓存,也许是一些其他事情)让容器为你做魔术(魔术,我的意思是大量的样板代码)。 路加

答案 4 :(得分:0)

首先,您可以编写一个单独的类:

Get获取数据的方法(使用Select查询)和Set方法来处理数据(插入,更新,删除)

using System.Data;
using System.Data.Odbc;
using System.Data.SqlClient;  //using this you can replace instead odbc to sql

// Example SqlCommand, SqlDataAdapter
class DataBaseConnection
{
    private OdbcConnection conn1 = new OdbcConnection(@"FILEDSN=C:/OTPub/Ot.dsn;" + "Uid=sa;" + "Pwd=otdata@123;"); //"DSN=Ot_DataODBC;" + "Uid=sa;" +  "Pwd=otdata@123;"

    //insert,update,delete
    public int SetData(string query)
    {
        try
        {
            conn1.Open();
            OdbcCommand command = new OdbcCommand(query, conn1);
            int rs = command.ExecuteNonQuery();
            conn1.Close();
            return rs;
        }

        catch (Exception ex)
        {
            conn1.Close();
            throw ex;
        }

    }

    //select
    public System.Data.DataTable GetData(string sql)
    {
        try
        {

            conn1.Open();
            OdbcDataAdapter adpt = new OdbcDataAdapter(sql, conn1);
            DataTable dt = new DataTable();
            adpt.Fill(dt);
            conn1.Close();
            return dt;

        }
        catch (Exception ex)
        {
            conn1.Close();
            throw ex;


        }


    }


}

在表单中,您可以将对象设为该数据库连接类

   DataBaseConnection db = new DataBaseConnection();

现在你使用get set方法调用get set set,如下所示

string sqlSpecialHoliyday = "SELECT * FROM  Holiday WHERE   Date_Time='" + selectdate + "' AND  IDH='50'"; 
                DataTable dtAdditionalholily = db.GetData(sqlSpecialHoliyday);

AD您可以使用设置方法设置数据

string insertloginlog = "INSERT INTO Login_Log (Service_No, Machine_Name) VALUES   ('" + serviceID + "','" + machiname + "')";
                int ret = db.SetData(insertloginlog);

希望这会有所帮助!