使用DataSet Datatable 更新数据库的三种方式
1:自动生成命令的条件 CommandBuilder 方法
a)动态指定 SelectCommand 属性
b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。
c)为了返回构造 INSERT、UPDATE 和 DELETE 。SQL CommandBuilder 必须执行 SelectCommand。
即:必须额外经历一次到数据源的行程,这可能会降低性能。这也是
自动生成命令的缺点。
d)SelectCommand 还必须返回至少一个主键或唯一列.
当CommandBuilder和DataAdapter关联时,就会自动生成DeleteCommand、
InsertCommand 和 UpdateCommand中为空的命令。即不空的不生成。
e)必须是一个表,SELECT的不能是多个表的联合。
#动生成命令的规则#
在数据源处为表中所有 RowState 为 Added 的行插入一行(不包括标识、表达式或时间戳等列)。
为 Modified 的行更新行(列值匹配行的主键列值) 。
Deleted 的行删除行(列值匹配行的主键列值).这就是为什么要求条件c.d
注意:
a)因为从SELECT数据到UPDATE数据,中间这段时间有可能别的用户已经对数据进行了修改。
自动生成命令这种UPDATE只对在行包含所有原始值并且尚未从数据源中删除时更新。
b)自动命令生成逻辑为独立表生成 INSERT、UPDATE 或 DELETE 语句,
而不考虑与数据源中其他表的任何关系。因此,当调用 Update
来为参与数据库中外键约束的列提交更改时,可能会失败。若要避免这一异常,
请不要使用 CommandBuilder 来更新参与外键约束的列,而应显式地指定用于执行该操作的语句。
下面是自动生成命令的例子
// Assumes that connection is a valid SqlConnection object.
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
DataSet custDS = new DataSet();
connection.Open();
adapter.Fill(custDS, "Customers");
// Code to modify data in the DataSet here.
// Without the SqlCommandBuilder, this line would fail.
adapter.Update(custDS, "Customers");
connection.Close();
2:使用 DataAdapter 更新数据源
注意:
a)如果 SelectCommand 返回 OUTER JOIN 的结果,则 DataAdapter
不会为生成的 DataTable 设置 PrimaryKey 值。您必须自己定义
PrimaryKey 以确保正确解析重复行.
b)如果对 DataSet、DataTable 或 DataRow 调用 AcceptChanges,
则将使 DataRow 的所有 Original 值都将被重写为该 DataRow 的 Current 值。
如果已修改将该行标识为唯一行的字段值,那么当调用 AcceptChanges 后,
Original 值将不再匹配数据源中的值。
下面例子
// Assumes connection is a valid SqlConnection.
SqlDataAdapter dataAdpater = new SqlDataAdapter(
"SELECT CategoryID, CategoryName FROM Categories", connection);
dataAdpater.UpdateCommand = new SqlCommand(
"UPDATE Categories SET CategoryName = @CategoryName " +
"WHERE CategoryID = @CategoryID" , connection);
dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");
SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryID", SqlDbType.Int);
parameter.SourceColumn = "CategoryID";
parameter.SourceVersion = DataRowVersion.Original;
DataSet dataSet = new DataSet();
dataAdpater.Fill(dataSet, "Categories");
DataRow row = dataSet.Tables["Categories"].Rows[0];
row ["CategoryName"] = "New Category";
dataAdpater.Update(dataSet, "Categories");
------------------------------------------------------------------------------------------------
插入、更新和删除的排序
在许多情况下,以何种顺序向数据源发送通过 DataSet 作出的更改是相当重要的。
例如,如果已更新现有行的主键值并且添加了具有新主键值的新行,
则务必要在处理插入之前处理更新。
可以使用 DataTable 的 Select 方法来返回仅引用具有特定 RowState 的 DataRow 数组。
然后可以将返回的 DataRow 数组传递到 DataAdapter 的 Update 方法来处理已修改的行。
通过指定要更新的行的子集,可以控制处理插入、更新和删除的顺序。
DataTable table = dataSet.Tables["Customers"];
// First process deletes.
adapter.Update(table.Select(null, null, DataViewRowState.Deleted));
// Next process updates.
adapter.Update(table.Select(null, null,
DataViewRowState.ModifiedCurrent));
// Finally, process inserts.
adapter.Update(table.Select(null, null, DataViewRowState.Added));
3.使用sql语句更新
例如:
cmd = new OleDbCommand(string.Format(@"insert into worker(workerid,workername,password,phoneno) values ('{0}','{1}','{2}','{3}') ", textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text),oc);
oc.Open();
try
{
int i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
}
性能的优劣及使用的情形,还未完全明白。
一般的,绑定bindingsource,用datatable绑定bindingsource (实质上绑定的是datatable。defaultview,同时可用到dataview的筛选功能,但但在筛选完后,filter要重置为null,否则出现的一直是经过筛选的数据)详见bindingsource 文章
其他:
1.使用builder 的作用:
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
这个主要是为了让C#自动为OleDbDataAdapter da生成相对应的DeleteCommand,UpdateCommand!
使用DataSet Datatable 更新数据库的三种方式的更多相关文章
- C#使用DataSet Datatable更新数据库的三种实现方法
本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参 ...
- python更新数据库脚本三种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...
- Code First03---CodeFirst根据配置同步到数据库的三种方式
上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以 ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. P ...
- laravel记录笔记Laravel 连接数据库、操作数据库的三种方式
laravel中提供DB facade(原始查找).查询构造器.Eloquent ORM三种操作数据库方式 1.连接数据库 .env 数据库配置 DB_HOST=localhost dbhost DB ...
- php连接MySQL数据库的三种方式(mysql/mysqli/pdo)
引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案 ...
- jdbc链接数据库的三种方式
/** * jdbc连接数据库 * @author APPle * */ public class Demo1 { //连接数据库的URL private String url = "jdb ...
- [UE4]更新UI的三种方式
一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...
随机推荐
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- oracle返回多结果集
kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ...
- [Papers]NSE, $u_3$, Lebesgue space [Kukavica-Ziane, Nonlinearity, 2006]
$$\bex u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{5}{8},\quad \frac{24}{5}<q ...
- storm入门教程 第四章 消息的可靠处理【转】
4.1 简介 storm可以确保spout发送出来的每个消息都会被完整的处理.本章将会描述storm体系是如何达到这个目标的,并将会详述开发者应该如何使用storm的这些机制来实现数据的可靠处理. 4 ...
- C# 无边框异型窗体制作
我是一个C#的初学者 只要涉及到windows窗体编程 都希望窗体的外观比较好看 不是系统默认的那样 对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法: 有 ...
- HDU5739 Fantasia 树形dp + 点双缩点
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...
- CMDB反思2
当云灭掉CMDB http://blog.vsharing.com/xqscool/A1193910.html 虽然之前也思考过当运维底层都被替换为云时,现有的传统运维可能就消失了,其所依赖的ITIL ...
- csv文件与DataTable互相导入处理
封装处理下,以后项目用到可以直接使用,比较简单. 1.首先看封装好的类 using System; using System.Data; using System.IO; using System.T ...
- 【windows核心编程】线程局部存储TLS
线程局部存储TLS, Thread Local Storage TLS是C/C++运行库的一部分,而非操作系统的一部分. 分为动态TSL 和 静态TLS 一.动态TLS 应用程序通过调用一组4个函数来 ...
- ubuntu下php5扩展mysqli
看网上说的都是自己编译源码,试了一下其实这样就可以了 sudo apt-get instal php5-mysql