ADO.net - 使用DataSet和DataAdapter对数据库连接有哪些限制?

时间:2009-10-12 14:17:02

标签: ado.net dataset

重新ADO.net,我得到了DataSet和DataAdapter的概念。我可能会问的是:

Q1 - 数据库连接是否需要保持打开有哪些限制?我可以关闭连接但仍然可以使用DataSet吗?如果是这样,需要做什么来执行更新? DataAdapter是否需要保留活动数据库连接?

Q2 - 如果我愿意的话,更常见的是,在使用WinForms应用程序的用户使用过程中,是让用户:

  1. 获取数据库中的初始数据(例如,使用DataAdapter读取DataSet),然后在某个时间点获取
  2. 向数据库添加新行,并将其显示在实际数据库中(即已保存)
  3. 添加另一条记录(但只保留在内存/数据集中)
  4. 一段时间后,保存从[3]
  5. 添加的新行

    在这里需要做的DataSet / DataAdapter / Connection是什么?您是否可以在最小化保持数据库打开的指导原则的所有步骤之间关闭数据库连接?

1 个答案:

答案 0 :(得分:2)

Q1您不需要保持数据库连接打开。要执行更新,请再次打开连接并调用dataadapter.update()

q2与q1几乎相同,直到再次打开连接并调用dataadapter.update(),更改将仅在本地数据集中。

  1. 打开连接
  2. 获取数据
  3. 关闭连接
  4. 操纵/添加数据
  5. 打开连接
  6. dataadapter.update()
  7. 关闭连接
  8. 当然,我确定在特定情况下会有例外情况。

    旁注,如果使用c#,我更喜欢使用USING构造,它将在非托管对象上调用dispose并关闭连接。

    修改

    使用数据适配器http://msdn.microsoft.com/en-us/library/33y2221y.aspx

    更新数据

    一个非常简单的例子

      {
            SqlDataAdapter ad;
            SqlConnection con;
            SqlCommand cm_insert;
            SqlCommand cm_select;
            DataSet employees;
            employees = new DataSet();
            ad = new SqlDataAdapter();
            cm_select = new SqlCommand("select * from employees");
            cm_insert = new SqlCommand("insert into employees values(@employeename) ");
            cm_insert.Parameters.Add("@employeename", SqlDbType.VarChar, 50, "employeename");
            ad.InsertCommand = cm_insert;
            ad.SelectCommand = cm_select;
    
    
    
    
    
            using (con = new SqlConnection(@"data source=csl066\sqlexpress;initial catalog=junk;Integrated Security=SSPI;persist security info=False;packet size=4096"))
            {
    
                cm_select.Connection = con;
                con.Open();
                ad.Fill(employees);
    
            }
            //Do other work, collect data, sometime later in the app..
            using (con = new SqlConnection(@"data source=csl066\sqlexpress;initial catalog=junk;Integrated Security=SSPI;persist security info=False;packet size=4096"))
            {
                cm_insert.Connection = con;
                con.Open();
                employees.Tables[0].Rows.Add(new string[] { "Allen" });
                ad.Update(employees);
            }
    
        }