C# 向数据库批量更新数据(插入、更新、删除)

批量操作数据是利用 CommandBuilder  和 DataAdapter.Update() 方法 对数据库进行批量更新

说解:
DataAdapter中有四个重要对象:SelectCommand,InsertCommand,UpdateCommand ,DeleteCommand  以SelectCommand 最为重要
只要设置好DataAdapter.SelectCommand(其中的CommandText) 其它三个可以由 CommandBuilder  自动生成。如下面看到的:

OracleDataAdapter adp = new OracleDataAdapter(cmd); 
OracleCommandBuilder ocb = new OracleCommandBuilder(adp);
dataAdapter.SelectCommand.CommandText = "SELECT * FROM BOBIMPORT WHERE ROWNUM=0";

//以下可以不用执行
//dataAdapter.InsertCommand = ocb.GetInsertCommand();
//dataAdapter.UpdateCommand = ocb.GetUpdateCommand();
//dataAdapter.DeleteCommand = ocb.GetDeleteCommand();

//dataAdapter.SelectCommand 对象其实就是对 cmd的引用。

(2023-02-28修改)总结:

1、为了能够自动生成命令,必须设置 SelectCommand 属性,这是最低要求。 由 SelectCommand 属性检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。

2、为了返回构造 INSERT、UPDATE 和 DELETE SQL 命令所需的元数据,DbCommandBuilder 必须执行 SelectCommand。 因此,必须额外经历一次到数据源的过程,这可能会降低性能。 若要实现最佳性能,请显式指定命令而不是使用 DbCommandBuilder。

3、dataAdapter.SelectCommand 必须至少返回一个主键或唯一列,如果不存在任何主键和唯一列,则会生成 InvalidOperation 异常,并且不会生成命令。

4、当与 DataAdapter 关联时,DbCommandBuilder 会自动生成 InsertCommand 的 UpdateCommand、DeleteCommand 和 DataAdapter 属性(如果它们为空引用)。 如果某个属性已存在 Command,则使用现有 Command。

5、通过联接两个或更多个表来创建的数据库视图不会被视为单个数据库表。 在这种情况下,您无法使用 DbCommandBuilder 来自动生成命令;必须显式指定命令。 有关通过显式设置命令将 DataSet 更新解析回数据源的信息,请参阅使用 DataAdapters 更新数据源。

代码如下:

 using (OracleConnection con = new OracleConnection(CONNECTIONSTR))
            {
                using (OracleCommand cmd = con.CreateCommand())
                {
                    using (OracleDataAdapter da = new OracleDataAdapter(cmd))
                    {
                        System.Data.DataTable dtDB = new System.Data.DataTable();
                        //添加列,列的类型要求和数据库中要操作的表的列类型一致或兼容,以oracle为例
                        dtDB.Columns.Add("user_id", typeof(string)); //varchar2
                        dtDB.Columns.Add("name", typeof(string));    //varchar2
                        dtDB.Columns.Add("sex", typeof(decimal));    //number
                        dtDB.Columns.Add("moneh", typeof(double));   //number(10,2)
                        
                        OracleCommandBuilder ocb = new OracleCommandBuilder(da);
                        //必须要有SelectCommand, da.SelectCommand对象是cmd的引用
                        da.SelectCommand.CommandText = "SELECT * FROM BOBIMPORT WHERE ROWNUM=0";
                        da.InsertCommand = ocb.GetInsertCommand();
                        
                        //da.Fill(dtDB);   如果上面指定了InsertCommand 就不用fill

                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dtDB.Rows.Add(dt.Rows[i].ItemArray);
                            
                        }
                        int count=da.Update(dtDB);

                        MessageBox.Show(count.ToString());
                    }
                }


 

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值