日期:2014-05-17  浏览次数:20845 次

使用ADO.NET什么时候需要加上con.Open()啊?
SqlConnection con = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["carConnectionString"].ToString());
  {
  string cmd1 = "select * from powers where username='"+username+"' and power=1";
  SqlDataAdapter da = new SqlDataAdapter(cmd1, con);
  DataSet ds = new DataSet();//创建数据集
  da.Fill(ds);//填充数据集
  DataTable dt = ds.Tables[0];
  if (dt.Rows.Count ==0)
  {
  Response.Write("<script LANGUAGE='javascript'>alert('您没有权限使用该功能!');window.close();</script>");
  }


  cmd1 = "select * from works where username='" + username +"'";
  da = new SqlDataAdapter(cmd1, con);
  ds = new DataSet();//创建数据集
  da.Fill(ds);//填充数据集
  dt = ds.Tables[0];

  for (int i = 0; i < dt.Rows.Count; i++)
  {
  Label lb = new Label();
  lb.Text = dt.Rows[i]["wcontain"].ToString().Trim();
  lb.CssClass = "lbs";
  lb.Attributes.Add("ondblclick", "justtest()");
  lb.ID = dt.Rows[i]["wid"].ToString().Trim();
  this.Panel1.Controls.Add(lb);

  }
  }

------------------------------------------------
像我上面的代码使用起来完全没问题,可是我完全没加入con.Open()语句啊,这样不是数据库没连接上么?为何打开网页却能正确的查找到和显示出数据库里的数据?求指教啊谢谢
话说有人说貌似fill函数会判断数据库连接,如果没有打开会自动打开,是因为这样么???

------解决方案--------------------
构造函数的时候已经分配了连接字符串,SqlDataAdapter会创建数据库连接,如果是SqlConnection对象则直接使用传入的SqlConnection,SqlDataAdapter会自动打开和关闭的.

至于关闭,msdn说是保持使用之前的状态,如果使用之前已经打开,那么数据填充完成后也是打开状态,不会自动关闭。
------解决方案--------------------
da.Fill时会连接


Fill 方法使用 SELECT 语句从数据源中检索数据。与 Select 命令关联的 IDbConnection 对象必须有效,但不需要将其打开。如果调用 Fill 之前 IDbConnection 已关闭,则将其打开以检索数据,然后再将其关闭。如果调用 Fill 之前连接已打开,它将保持打开状态。
------解决方案--------------------
Fill方法会判断数据连接的状态,如果没有打开会自动打开,Fill完后Close掉;如果原先打开则直接Fill,然后保持打开状态.
类似的还有Update方法。
------解决方案--------------------
用DATAADAPTER时,它会默认OPEN
其它都要手动代码打开