【问题标题】:How to convert collections to DataTable for Ado.Net SqlDataAdapter.Update?如何将集合转换为 Ado.Net SqlDataAdapter.Update 的 DataTable?
【发布时间】:2014-06-30 17:34:59
【问题描述】:

如何完成以下函数,该函数接受三个集合参数,用于删除、插入和更新记录,并将集合转换为DataTable 以供DataAdapter 更新表?

我在How to fill a datatable with List<T> 找到了一种将 List 转换为 DataTable 的方法。但是DataTable中没有设置insert、update、delete标志?

void Save(
    IEnumerable<int> deleted, 
    IEnumerable<Poco1> inserted, 
    IEnumerable<Poco1> updated)
{
    var dt = new DataTable(); 
    .... // Initialize dt with deleted, inserted and update?

    using (var con = new SqlConnection(ConnectionStr))
    {
        con.Open();
        var da = new SqlDataAdapter("select * from table", con);
        da.Update(dt);
    }
}

或者有没有更好的方法从这三个集合中更新数据库表? (C# 3.5)

【问题讨论】:

    标签: c# ado.net


    【解决方案1】:

    首先,您还需要定义插入、更新和删除命令:

    // Create the other commands.
    da.InsertCommand = new SqlCommand("...how to insert");
    
    da.UpdateCommand = new SqlCommand("...how to update");
    
    da.DeleteCommand = new SqlCommand("...how to delete");
    

    或者,您可以尝试使用 DbCommandBuilder 在运行时为您完成:

    // Create the DbCommandBuilder.
    DbCommandBuilder builder = factory.CreateCommandBuilder();
    builder.DataAdapter = da;
    
    // Get the insert, update and delete commands.
    da.InsertCommand = builder.GetInsertCommand();
    da.UpdateCommand = builder.GetUpdateCommand();
    da.DeleteCommand = builder.GetDeleteCommand();
    

    接下来,您需要定义 DataTables 以匹配您的目标表:

    DataTable dt = new DataTable();
    dt.Columns.Add(add your columns...)
    

    然后您需要向 DataTable 添加行,确保将该行标记为已插入、已更新或已删除。

    DataRow dr = dt.NewRow();
    dr["your column"] = ...
    // Don't forget to add the row to the table!
    dt.Rows.Add(dr);
    // Once the row is added then go ahead and mark it as deleted, modified or new
    dr.Delete()
    // or
    dr.SetAdded();
    // or
    dr.SetModified();
    

    【讨论】:

    • 我得到了“附加信息:SetAdded 和 SetModified 只能在具有未更改 DataRowState 的 DataRows 上调用”的异常。当调用dr.SetModified();等时
    • 在设置状态之前尝试在行上调用 .AcceptChanges()。
    【解决方案2】:

    它不会像你做的那样工作,这样做

     using (var con = new SqlConnection(ConnectionStr))
        {
            con.Open();
            var da = new SqlDataAdapter("select * from table", con);
            var ds=new DataSet();
            da.Fill(ds);
            var dt= ds.Tables[0];
            // all deleted rows 
            foreach(DataRow dr in dt.Rows.ToList())
    {
        if(deleted.ToList().Contains((int)dr["id"]))
    {
            dr.Delete();
    }
    //all updated rows 
    foreach(var poco in updated.ToList()
    {
      DataRow dr = table.Select("id="+poco.id).FirstOrDefault();
      dr["field1]=poco.feild1 
      ....set all updated values 
    
    }
    //all inserted rows 
    foreach(var poco in inserted.ToList())
    {
      var dr= dt.NewRow();
      dr["id"]=poco.id;
      ..set all fields
      dt.Rows.Add(dr);
    }
    }
            dt.Accept
            da.Update(dt);
        }
    

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2020-08-21
      • 2017-12-24
      • 2013-05-04
      • 2020-09-04
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多