我有以下代码来填充下拉列表:
string strConn = ConfigurationManager.ConnectionStrings["PhoQL"].ConnectionString;
using (SqlConnection con = new SqlConnection(strConn))
{
DataSet ds = new DataSet();
using (SqlDataAdapter myda = new SqlDataAdapter("SELECT [Abrv], [State] FROM [States]", con))
{
myda.Fill(ds)
ddlShipState.DataSource = ds;
}
}
ddlShipState.DataTextField = "State";
ddlShipState.DataValueField = "Abrv";
ddlShipState.DataBind();
我想知道是否有更有效的方法。注意我没有打开和关闭连接。想知道它是否会对我的例子产生影响。 为了提高效率,我正在寻找最佳代码实践。
答案 0 :(得分:0)
注意我没有打开和关闭连接。
不,但DataAdapter
隐含了这一点。
MSDN:
如果在调用Fill之前关闭了IDbConnection,则会打开它 检索数据然后关闭。如果连接在Fill之前打开 被称为,它仍然是开放的。
但是请注意,当您使用Connection-Pooling
(默认)时,打开和关闭效率不高。因为con.Open
只是意味着“等待,我现在需要这个连接”而con.Close
意味着“好的,你现在可以在其他地方重复使用它,我已经完成了。”
因此,您应该在完成连接后立即关闭连接。否则,连接池每次都需要打开新的物理连接,这可能导致异常(最大默认连接数为100)但总是会降低性能。
处理/关闭连接(任何IDisposable
)的最佳方式是使用using
statement:
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["PhoQL"].ConnectionString))
using(var cmd = new SqlCommand("SELECT [Abrv], [State] FROM [States]", con))
using(var da = new SqlDataAdapter(cmd))
{
DataTable tbl = new DataTable();
da.Fill(tbl);
ddlShipState.DataSource = tbl;
ddlShipState.DataTextField = "State";
ddlShipState.DataValueField = "Abrv";
ddlShipState.DataBind();
}
(旁注:我已将DataSet
替换为“打火机”DataTable
)
答案 1 :(得分:0)
如果你反复这样做,你应该考虑缓存数据:
http://msdn.microsoft.com/en-us/library/aa478965.aspx
这样你就可以只打一次数据库......即使有10,000个用户。