概述
批量操作数据是利用 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());
}
}
最后
以上就是淡然机器猫为你收集整理的C# 向数据库批量更新数据(插入、更新、删除)的全部内容,希望文章能够帮你解决C# 向数据库批量更新数据(插入、更新、删除)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复