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