dataAdapter .Fill和.Update的比较

时间:2013-01-13 16:25:02

标签: c# database dataadapter

我一直在阅读MSDN资源和几个论坛,但仍然不明白这两个dataAdapter.Fill()dataAdapter.Update()之间有什么区别,我试图用它们来更新数据库从我的程序,它的工作原理,但当我尝试删除update()函数,它仍然完美,因此我认为它没用。

有人可以澄清这个吗?

编辑: 这是我要删除的代码:

string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Public\\Documents\\inventorySystem\\branches\\Database\\inventorySystemDatabase.accdb";
string query = "DELETE FROM Product WHERE product_id=" + productDataGridView[1, e.RowIndex].Value.ToString();
OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString);
OleDbCommandBuilder deleteBuilder = new OleDbCommandBuilder(dAdapter);
DataTable deleteTable = new DataTable();
dAdapter.Update(deleteTable);

- 我必须做一个额外的select命令来更新datagridview -

2 个答案:

答案 0 :(得分:5)

工作样本

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private OleDbConnection con =
            new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\test.mdb\";");

        private OleDbDataAdapter adapter;
        DataTable table = new DataTable("person"); 

        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            con.Open();
            ;
            adapter = new OleDbDataAdapter("select ID, p_name, p_age from person", con);
            adapter.Fill(table);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
            adapter.DeleteCommand = builder.GetDeleteCommand();
            adapter.UpdateCommand = builder.GetUpdateCommand();
            adapter.InsertCommand = builder.GetInsertCommand();
            dataGridView1.DataSource = table;

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            con.Close();
            con.Dispose();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            DataRow[] row = table.Select("p_age = 10");
            if (row.Length > 0)
            {
                for (int i = 0; i < row.Length; i++)
                {
                    row[i].Delete();
                }
            }
            adapter.Update(table);
        }

    }
}

简单来说。

DataAdapter.Fill()用于从数据库加载数据

示例:将数据从数据库显示到gridview

using (DataTable table = new DataTable()) {

    using (OleDbDataAdapter adapter = new OleDbDataAdapter("select name,age from person", conObject)) {

        adapter.Fill(table);
        BindingSource bs = new BindingSource { DataSource = table };
        dgReader.DataSource = bs;    
    }

}

一旦编辑完成,DataAdapter.Update()就会使用底层连接将所有已更改的数据信息提交到数据库。

<强> DataAdapter.Fill()

  

Fill方法使用SELECT从数据源中检索行   由关联的SelectCommand属性指定的语句。该   与SELECT语句关联的连接对象必须有效,   但它不需要打开。如果之前连接已关闭   调用Fill,打开它以检索数据,然后关闭。如果   在调用Fill之前连接已打开,它仍保持打开状态。

     

然后,“填充”操作会将行添加到目标DataTable对象   在DataSet中,创建DataTable对象(如果尚未创建)   存在。创建DataTable对象时,通常会执行“填充”操作   仅创建列名元数据。但是,如果是MissingSchemaAction   property设置为AddWithKey,相应的主键和   也创造了约束。

<强> DataAdapter.Update()

  

更新是逐行执行的。每插入一次,   修改和删除行,Update方法确定类型   已对其执行的更改(插入,更新或删除)。   根据更改类型,“插入”,“更新”或“删除”命令   模板执行以将修改的行传播到数据源。   当应用程序调用Update方法时,DataAdapter会检查   RowState属性,并执行所需的INSERT,UPDATE或   根据的顺序迭代地为每一行删除语句   DataSet中配置的索引。例如,Update可能会执行a   DELETE语句,后跟INSERT语句,然后是另一个   DELETE语句,由于DataTable中行的排序。

     

应该注意,这些陈述不是作为批次执行的   处理;每行都单独更新。一个应用程序可以调用   在必须控制序列的情况下的GetChanges方法   语句类型(例如,UPDATE之前的INSERT)。更多   信息,请参阅使用DataAdapter更新数据源(ADO.NET)。

答案 1 :(得分:4)

简而言之。

DataAdapter.Fill()代表来自服务器的 SELECT 查询语句到数据库。

// 1
// Open connection
using (SqlConnection c = new SqlConnection(
        Properties.Settings.Default.DataConnectionString))
{
   c.Open();
   // 2
   // Create new DataAdapter
   using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c))
     {
      // 3
      // Use DataAdapter to fill DataTable
         DataTable t = new DataTable();
         a.Fill(t);

         // 4
         // Render data onto the screen
         // dataGridView1.DataSource = t; // <-- From your designer
    }
  }

DataAdapter.Update()代表来自服务器的更新插入删除查询语句到数据库。

public DataSet CreateCmdsAndUpdate(DataSet myDataSet,string myConnection,string mySelectQuery,string myTableName) 
{
    OleDbConnection myConn = new OleDbConnection(myConnection);
    OleDbDataAdapter myDataAdapter = new OleDbDataAdapter();
    myDataAdapter.SelectCommand = new OleDbCommand(mySelectQuery, myConn);
    OleDbCommandBuilder custCB = new OleDbCommandBuilder(myDataAdapter);

    myConn.Open();

    DataSet custDS = new DataSet();
    myDataAdapter.Fill(custDS);

    //code to modify data in dataset here

    //Without the OleDbCommandBuilder this line would fail
    myDataAdapter.Update(custDS);

    myConn.Close();

    return custDS;
 }

参考:
C# SqlDataAdapter
DataAdapter.Update Method