static void Main(string[] args)
        {
            SqlConnection connection = new SqlConnection("Server =NIO\\SQLExpress" +
                                                          ";Integrated Security = True" +
                                                          ";Database =Northwind");
            SqlDataAdapter dataApapter = new SqlDataAdapter("SELECT CustomerID,CompanyName FROM Customers" , connection);
            Console.WriteLine(connection.State);//测试。
            SqlCommandBuilder builder = new SqlCommandBuilder(dataApapter);
            Console.WriteLine(connection.State);//测试。
            DataSet dataSet = new DataSet();
            Console.WriteLine(connection.State);//测试。
            dataApapter.Fill(dataSet , "Customers");
            Console.WriteLine(connection.State);//测试。
            Console.WriteLine("名字改变前:{0}" , dataSet.Tables[0].Rows[9]["CompanyName"]);
            Console.WriteLine(connection.State);//测试。
            dataSet.Tables[0].Rows[9]["CompanyName"] = "newCompanyName";
            Console.WriteLine(connection.State);//测试。
            dataApapter.Update(dataSet , "Customers");
            Console.WriteLine(connection.State);//测试。
            Console.WriteLine("名字改变后:{0}" , dataSet.Tables[0].Rows[9]["CompanyName"]);
            Console.WriteLine(connection.State);//测试。
            connection.Close();
            Console.WriteLine(connection.State);//测试。
            Console.ReadKey();
        }结果:Closed
Closed
Closed
Closed
名字改变前:Die Wandernde Kuh
Closed
Closed
Closed
名字改变后:newCompanyName
Closed
Closed
迷茫,谁可以解释一下吗?为什么不需要Open?什么时候需要,什么时候需要?建议需要还是建议不需要?
猜测:某一个语句自动打开,然后又自动关闭?详细解释下,我想不难吧?

解决方案 »

  1.   

    SqlDataAdapter会自动打开,关闭比如它的Fill方法,可能就会先打开,读取数据,然后关闭
      

  2.   

    SqlDataAdapter是为处理脱机数据而设计的,调用其Fill方法填充DataSet时甚至不需要与数据库的活动连接。即如果调用Fill方法时,SqlDataAdapter与数据库的连接不是打开时,SqlDataAdapter将打开数据库连接,查询数据库,提取查询结果,将查询结果填入DataSet,然后关闭也数据库的连接。
      

  3.   

    SqlConnection connection = new SqlConnection("Server =NIO\\SQLExpress" +
                                                              ";Integrated Security = True" +
                                                              ";Database =Northwind");
    还没打开呢/  SqlDataAdapter dataApapter = new SqlDataAdapter("SELECT CustomerID,CompanyName FROM Customers" , connection);  
    打开了又关闭了后面当然都是 Closed 没看出来什么不对的啊
      

  4.   

    调用SqlDataAdapter对象Fill方法过程的数据库连接的打开与关闭SqlDataAdapter的Fill方法调用前不需要有活动的SqlConnection对象,SqlDataAdapter会自己打开strConn语句中的数据库,获取查询结果后,关闭与数据库的连接。如果已经存在SqlConnection对象,无论是否已经打开,SqlDataAdapter执行完Fill方法后,均会将SqlConnection对象返回到原始状态。当程序中的多个SqlDataAdapter对象使用都一个SqlConnection对象时,为避免多次打开与关闭SqlConnection对象,应该在调用SqlDataAdapter的Fill方法前调用SqlConnection的Open方法打开数据库的连接,待完成Fill调用后再调用SqlConnection的Close方法关闭数据库的连接。
      

  5.   

    个人理解:
    对数据库insert、update、delete时,需要Open数据库连接对象,执行完再Close
    对数据库select查询时,不需要Open,只要设好适配器SqlDataAdapter,再填充数据集DataSet
      

  6.   

    在SqlDataAdapter它的内部,访问的时候,打开了,访问,再关闭...
      

  7.   

    sqldataadapter.fill()时如果sqlconnecttion已经打开,
    那么fill完sqlconnection的状态任然时open,如果fill时没有open ,那么open,fill完后立刻close
    这是我的理解
      

  8.   


    理解了。那么按照7楼朋友的理解是正确的?当只有SELECT时,便不需要OPEN?
      

  9.   

    我感觉有2次OPEN。
    1、
                dataApapter.Fill(dataSet , "Customers");
    2、
                dataApapter.Update(dataSet , "Customers");
      

  10.   

    只需知道它在Fill时会自动开关就够了
      

  11.   

    SqlDataAdapter对象的方法操作数据库自动开关数据库连接;
    SqlCommend对象的方法操作数据库需手动开关数据库连接;