6

我一直在阅读 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);

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

4

2 回答 2

6

工作样本

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()使用底层连接将所有更改的数据信息提交到数据库。

数据适配器.Fill()

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

Fill 操作然后将行添加到 DataSet 中的目标 DataTable 对象,如果 DataTable 对象不存在,则创建它们。创建 DataTable 对象时,Fill 操作通常只创建列名元数据。但是,如果 MissingSchemaAction 属性设置为 AddWithKey,还会创建相应的主键和约束。

DataAdapter.Update()

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

需要注意的是,这些语句不是作为批处理执行的;每行单独更新。在您必须控制语句类型顺序的情况下(例如,INSERT before UPDATE),应用程序可以调用 GetChanges 方法。有关详细信息,请参阅使用 DataAdapters (ADO.NET) 更新数据源。

于 2013-01-13T16:31:52.633 回答
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 方法

于 2013-01-13T16:35:25.703 回答