【问题标题】:Comparison of dataAdapter .Fill and .UpdatedataAdapter .Fill 和 .Update 的比较
【发布时间】:2012-12-27 15:29:48
【问题描述】:

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

-- 我必须做一个额外的选择命令来更新数据网格视图--

【问题讨论】:

  • 你能分享你的代码吗?
  • @AndrewTaswin - 添加示例代码,查看答案!

标签: c# database dataadapter


【解决方案1】:

工作样本

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对象时,Fill操作正常 仅创建列名元数据。但是,如果 MissingSchemaAction 属性设置为 AddWithKey,适当的主键和 约束也被创建。

DataAdapter.Update()

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

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

【讨论】:

  • 如果我使用我的代码进行删除,它不会使用 dataAdapter.update() 更新,我必须调用 select 命令来查看数据库。这是正确的做法吗?
  • 感谢您的解释!因此,如果您不介意,我将重新解释我的理解。因此,如果我将删除查询发送到数据库,它将直接重新修改数据库,因此我不必更新它,但是如果我在程序中更改数据表,我必须在更改其值后更新数据库,对吗?
  • 它会直接修改数据库,但是由于您已经在 DataTable 中加载了行,项目不会从 DataTable 中删除,而是直接从数据库中删除,因此适配器通过属性分配为更新、删除和插入命令。所以每当调用更新命令时,它们都会被调用
  • 来自 MSDN : Update(DataTable) -> 为指定 DataTable 中每个插入、更新或删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。
  • 在我的代码中修复了一个错误我已经从 table.Rows.Remove(row[i]); 更改了 btnDelete_Click 下的一行到 row[i].Delete();
【解决方案2】:

简称定义。

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

【讨论】:

  • 所以基本上我还是要在删除时使用 .fill() 吗?
  • 没有。只需使用删除。我的回答只是一个例子,显然我们应该先使用Fill,然后才能使用Update
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多