在前面《C# Command》一节中已经介绍了使用 SqlCommand 对象中的 ExecuteNonQuery 方法执行非查询 SQL 语句来实现对数据表的更新操作,使用 DataSet 对象也能实现相同的功能, 并且能节省数据访问时间。

每个 DataSet 都是由多个 DataTable 构成的,更新 DataSet 中的数据实际上是通过更新 DataTable 来实现的。

每个 DataTable 对象都是由行 (DataRow) 和列 (DataColumn) 构成的,下面分别介绍 DataRow 类和 DataColumn 类的使用。

1) DataRow 类

DataRow 类代表数据表中的行,并允许通过该类直接对数据表进行添加、修改、删除行的操作。

DataRow 类中常用的属性和方法如下表所示。

属性或方法

说明

Table

属性,设置 DataRow 对象所创建 DataTable 的名称

RowState

属性,获取当前行的状态

HasErrors

属性,获取当前行是否存在错误

AcceptChanges()

方法,更新 DataTable 中的值

RejectChanges()

方法,撤销对 DataTable 中的值的更新

Delete()

方法,标记当前的行被删除,并在执行 AcceptChanges 方法后更新数据表

在 DataRow 类中没有提供构造方法,需要通过 DataTable 中的 NewRow 方法创建 DataRow 类的对象,具体的语句如下。

DataTable dt = new DataTable();

DataRow dr = dt.NewRow();

这样,dr 即为新添加的行,每行数据是由多列构成的,如果在 DataTable 对象中已经存在表结构,则直接使用dr[ 编号或列名 ]= 值的形式即可为表中的列赋值。

2) DataColumn 类

DataColumn 类是数据表中的列对象,与数据库中表的列定义一样,都可以为其设置列名以及数据类型。

DataColumn类中常用的构造方法如下表所示。

构造方法

说明

DataColumn()

无参构造方法

DataColumn(string columnName)

带参数的构造方法,columnName 参数代表的是列名

DataColumn(string columnName,Type dataType)

带参数的构造方法,columnName 参数代表的是列名,dataType 参数代表的是列的数据类型

DataColumn 类提供了一些属性对 DataColumn 对象进行设置,常用的属性如下表所示。

属性

说明

ColumnName

属性,设置 DataColumn 对象的列名

DataType

属性,设置 DataColumn 对象的数据类型

MaxLength

属性,设置 DataColumn 对象值的最大长度

Caption

属性,设置 DataColumn 对象在显示时的列名,类似于给表中的列设置别名

DefaultValue

属性,设置 DataColumn 对象的默认值

AutoIncrement

属性,设置 DataColumn 对象为自动增长列,与 SQL Server 中数据表的标识列类似

AutoIncrementSeed

属性,与 AutoIncrement 属性联用,用于设置自动增长列的初始值

AutoIncrementStep

属性,与 AutoIncrement 属性联用,用于设置自动增长列每次增加的值

Unique

属性,设置 DataColumn 对象的值是唯一的,类似于数据表的唯一约束

AllowDBNull

属性,设置 DataColumn 对象的值是否允许为空

下面通过实例来演示 DataRow 类和 DataColumn 类的使用。

【实例】通过 DataRow 类、DataColumn 类以及 DataTable 类设计专业信息表,并向该表中添加专业,在 ListBox 控件中显示所有专业信息。

专业信息表的列包括专业编号、专业名称,要求专业编号是自动增长列,专业名称是唯一值。

创建 Windows 应用程序,添加专业信息并查询的界面设计如下图所示。

在每次新添加专业名称时将新的专业添加到ListBox控件中,实现的代码如下。

public partial class DataRowform : Form

{

//创建DataTable类的对象其表明为major

private DataTable dt = new DataTable("major");

//在构造方法中初始化DataTable对象,设置DataTable 中的列

public DataRowform()

{

InitializeComponent();

//创建专业编号列,列明为id 、数据类型为整型

DataColumn id = new DataColumn("id", typeof(int));

//设置id为自动增长列

id.AutoIncrement = true;

//设置id的初始值

id.AutoIncrementSeed = 1;

//设置id每次增长的值

id.AutoIncrementStep = 1;

//将id列加入到DataTable中

dt.Columns.Add(id);

//创建专业名称列,列明为name,数据类型为字符串类型

DataColumn name = new DataColumn("name", typeof(string));

//设置name列的值是唯一的

name.Unique = true;

//将name列加入到DataTable 对象中

dt.Columns.Add(name);

}

//添加按钮的单击事件

private void button1_Click(object sender, EventArgs e)

{

//向DataTable中天加一行,创建DataRow对象

DataRow dr = dt.NewRow();

//添加专业名称列的值

dr["name"] = textBox1.Text;

//将DataRow添加到DataTable对象中

dt.Rows.Add(dr);

//设置ListBox控件中的DataSource属性

listBox1.DataSource = dt;

//设置在listBox控件中显示的列

listBox1.DisplayMember = dt.Columns["name"].ToString();

}

}

运行该窗体,效果如下图所示。

从上面的运行效果可以看出,DataTable 类的使用与直接设计数据库中的表是类似的,只是没有将数据存储到数据库中。

既然使用 DataTable 类能完成与表设计和操作相同的功能,那么通过更新 DataTable 来更新数据库中的数据表效果会事半功倍,并能在离线状态下保存数据。

cdatatable大数据操作_C# DataRow和DataColumn:更新数据表相关推荐

  1. python db.commit_python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)...

    今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...

  2. 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?...

    要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略):要提升更新数据的性能可以使用PreparedState ...

  3. mysql更新数据能回滚吗_mysql更新数据能回滚吗?如何实现呢?

    不熟悉使用mysql数据库的朋友们,可能会对其有非常多的小问题,例如说,mysql更新数据可以回滚吗?我们应该如何去实现呢? 操作数据库时候难免会因为"大意"而误操作,需要快速恢复 ...

  4. Python数据可视化案例二:动态更新数据

    在开发与数据监测和数据可视化有关的系统时,我们会需要根据最新的数据对图形进行更新.下面的代码模拟了这种情况,单击Start按钮时会更新数据并重新绘制图形使得曲线看上去在移动一样,单击Stop按钮则停止 ...

  5. 数据仓库Hive编程——HiveQL的数据操作(一):向管理表中装载数据

    既然Hive没有行级别的数据插入.数据更新和删除操作,那么往表中装载数据的唯一途径就是使用一种"大量"的数据装载操作.或者通过其他方式仅仅将文件写入到正确的目录下. 在<Hi ...

  6. python sqlite3更新数据,python sqlite3-使用f字符串更新数据库函数

    我有自己的个人数据库,这是为了好玩(所以我不把SQL注入作为我自己的私人数据库),我正在尝试更改我创建的使用字符串格式(.format())和占位符(?,然后使用f字符串.我遇到了一个问题,在我将sq ...

  7. 在mysql中 更新数据中where_SQL中使用UPDATE更新数据时一定要记得WHERE子句

    Servlet访问第一次500,刷新后404的解决办法 第一次运行错误:HTTP Status 500 -  --------------------------------------------t ...

  8. SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比

    引文 本文主要介绍如何使用mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:mybatis插件(拦截器). ...

  9. 【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

    1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a = torch.tensor([[1,2],[3,4]]) print(torch.resha ...

最新文章

  1. Sudo 漏洞隐患不断,macOS 也受牵连!
  2. 如何在windows 10 x64安装佳能 CP900 驱动
  3. mysql list列表批量更新数据,Mybatis传入List实现批量更新的示例代码
  4. MySQL无法修改字段
  5. boost::function模块实现分配器的测试程序
  6. 数据库事务原理详解-数据库隔离级别
  7. c语言指针易错情况,C语言/C++从入门到精通之指针易错点总结
  8. MySQL学习-子查询及limit分页
  9. python制作软件excel_利用Python制作一个 截图+Excel操作浏览器小工具
  10. 接受字符串参数,返回一个元组,并分别统计字符串中大小写的个数
  11. 无法安装冰点还原_教程|有备有还,再备不难,如何实现整机还原?
  12. 运维为什么这么难招?
  13. Euclid最大公因数算法及其扩展求逆元
  14. NYOJ-71:独木舟上的旅行
  15. 微信分销商城如何推广比较吸引粉丝
  16. 半小时速通Python标准库os
  17. Single-Stage 6D Object Pose Estimation——6D姿态估计
  18. Apache Zeppelin 简单介绍,以及下载地址
  19. Xilinx 7系列FPGA之Kintex-7产品简介
  20. 一个普通的计算机专业专科生,毕业后想拿高薪,大学三年具体应该怎么做?

热门文章

  1. 你的孩子,未来20年将面临怎样的阶层分化?
  2. js处理后端返回超过16位大数字方案
  3. 目前SEP 离线升级包下载及升级方法
  4. 样本量极少如何机器学习?
  5. Aurora 数据库支持多达五个跨区域只读副本
  6. 全景图转小行星视角投影原理详解
  7. php 转换 html code,PHP 将 HTML 代码 转换到 UBB 论坛代码
  8. 腾讯新闻android2.3,腾讯新闻Android客户端更新 加入投票功能
  9. jenkins邮件使用自定义变量
  10. 国产浏览器的创新之路,拼的就是用户体验