public static DataSet GetDataSet(string stringSql)
        {
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(stringSql, conn);
                adapter.Fill(ds);
            }
            return ds;
        }
        public static int ExecuteScalar(string stringSql)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand(stringSql, conn))
                {
                    try
                    {
                        conn.Open();
                        object obj = cmd.ExecuteScalar();
                        int i = Convert.ToInt32(obj);
                        return i;
                    }
                    catch (System.Data.SqlClient.SqlException ex)
                    {
                        conn.Close();
                        throw ex;
                    }
                }
            }
        }
好吧执行查询的时候没有Open怎么也可以查询?
还有什么时候用 using (SqlCommand cmd = new SqlCommand(stringSql, conn))
                {                 }

解决方案 »

  1.   

    SqlDataAdapter  是不需要 open的在不需要返回结果集或需要返回SqlDataReader
    都可以用SqlCommand cmd = new SqlCommand(stringSql, conn)cmd.ExecuteNonQuery();
    cmd.ExecuteReader();
      

  2.   

    1、没有Open就能查询,这个是不会的,连接没有打开是不行的。
    2、using的写法是很优美的写法,用于自动释放对象。即出了{}大括号,cmd自动销毁,无需手动释放。
      

  3.   

    open打开连接才能和数据库链接using关键字是用来自动释放非托管资源的
      

  4.   

    严谨点说,是cmd的非托管资源被回收,因为using会自动转换成对Dispose()的调用。
      

  5.   

    1、SqlDataAdapter 内部会自动open和close2、using (SqlCommand cmd = new SqlCommand(stringSql, conn))这个就好像你在家吃饭,吃饭前要把饭桌拿出来摆好,吃晚饭立刻把饭桌收拾起来。如果不使用using呢,就好比你去饭店吃饭,吃晚饭了,饭桌也不会立即收拾起来,因为还会有下一波客人。
      

  6.   

    任何一个 DbDataAdapter 都会自动执行 Dbconnection 的 Open 语句。你只要写 using (SqlConnection .... 就行了,完全没有任何必要去写 using (SqlCommand .... 这里的using。写了除了让你的程序变慢一些,我没有发现有什么作用。这个 cmd 交给GC 去处理就行了,用不着画蛇添足地调用 Dispose()。你无需写 try...catch。当出现异常,第一个 using 自然就做了这些事情,你写了catch部分反而是让第一个 using 白写了。
      

  7.   

    DbDataAdapter (它是 SqlDataAdapter 的父类)对象会自动判断是否需要执行 Open,但是它不会去执行什么 Close。在你使用 using 来确保“优美的”调用 Dispose()的时候,要注意理解为什么要调用 Dispose() 方法。如果你不知道为什么要调用 Dispose() 方法,见到什么对象实例化都去写 using,那岂不是画蛇添足?
      

  8.   

    写了一段简单的代码,来看看 SqlDataAdapter  有没有自动 close
     string connString = @"Data Source=. 省略若干字符;";
                string sql = "select * from Manage_Table";
                SqlConnection cn = new SqlConnection(connString);
                SqlCommand cm = new SqlCommand(sql,cn);
                SqlDataAdapter da = new SqlDataAdapter(cm);
                DataTable dt = new DataTable();
                da.Fill(dt);            Response.Write(dt.Rows.Count);
                Response.Write("<br>");
                Response.Write(cn.State );
    运行结果是44
    Closed到数据库里取了数据,一共有44条,然后状态是 close。请问我的这段代码有啥问题没?(不考虑资源有没有及时释放)如果没啥问题的话,那么请问,是啥时候close的呢?
      

  9.   

    如果你写了 SqlCommand 用来重写方法 比如 ExcuteReader 方法带参和不带参
    就需要 open  close。 你在用 SqlCommand 不就是已经打开了么
      

  10.   


    using 里面会不会自动close?
      

  11.   

    写了一段简单的代码,来看看 SqlDataAdapter  有没有自动 close
    C# code
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     string connString = @"Data Source=. 省略若干字符;";
                string sql = "select * from Manage_Table";
                SqlConnection cn = new SqlConnection(connString);
                SqlCommand cm = new SqlCommand(sql,cn);
                SqlDataAdapter da = new SqlDataAdapter(cm);
                DataTable dt = new DataTable();
                da.Fill(dt);
     
                Response.Write(dt.Rows.Count);
                Response.Write("<br>");
                Response.Write(cn.State );
     
    运行结果是44
     Closed到数据库里取了数据,一共有44条,然后状态是 close。 请问我的这段代码有啥问题没?(不考虑资源有没有及时释放) 如果没啥问题的话,那么请问,是啥时候close的呢?
    SqlDataAdapter对象会根据需要打开连接,但是不会更改连接的状态,
    所以如果连接之前是关闭的,在SqlDataAdapter对象Fill完后还是关闭的,
    如果是打开的,Fill完还是打开的
      

  12.   


    “如果连接之前是关闭的,在SqlDataAdapter对象Fill完后还是关闭的,”fill前是关闭的,fill中一定是打开了对吧,否则无法填充数据。然后fill之后呢?你说了,是关闭的,那么是谁关闭的呢?不是 SqlDataAdapter吗?所以我说 SqlDataAdapter 可以自动close,这个并没有错。我举的例子并没有事先手动open。