0

我有以下代码来填充下拉列表:

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();

我想知道是否有更有效的方法来做到这一点。请注意,我不必打开和关闭连接。想知道它是否对我的例子有影响。就更高效而言,我正在为上述内容寻找最佳代码实践。

4

2 回答 2

0

请注意,我不必打开和关闭连接。

不,但DataAdapter它是隐含的。

MSDN

如果在调用 Fill 之前关闭了 IDbConnection,则打开它以检索数据,然后关闭它。如果在调用 Fill 之前连接已打开,则它保持打开状态。

但还要注意,在使用时打开和关闭并不是低效的Connection-Pooling(默认)。因为 thencon.Open只是意味着“等等,我现在需要这个连接”并且con.Close意味着“好的,你现在可以在其他地方重用它,我已经完成了”。

因此,您应该始终在完成连接后立即关闭它。否则,连接池每次都需要打开新的物理连接,这可能会导致异常(最大默认连接数为 100),但总是会降低性能。

处置/关闭连接(任何IDisposable)的最佳方法是使用以下using语句

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

于 2012-11-16T15:06:12.680 回答
0

如果你一遍又一遍地这样做,你应该考虑缓存数据:

http://msdn.microsoft.com/en-us/library/aa478965.aspx

这样,您只需访问数据库一次……即使有 10,000 个用户。

于 2012-11-16T15:06:45.843 回答