【ADO.NET】8、DataSet的使用

时间:2023-01-29 17:07:47
一、DataSet的查询

SqlDataReader 适用于大型数据的读取,它是一条一条的读取,读取出来的数据是存放在服务器上
当正在读取数据的时候,突然与服务中断,将无法读取后面的数据
DataSet 适用于小型数据的读取,它是一次将所有数据读取并存放到本机程序的内存当中,占内存
当正在读取数据的时候,突然与服务中断,数据可继续读取

DataSet可存放若干个表(DataTable),每个表有若干个行(DataRow)

    private void button3_Click(object sender, EventArgs e)  //单击事件
{
string Str = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(Str))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_Age";
DataSet dataset = new DataSet(); //创建一个DataSet集,用于存放查询到的数据
SqlDataAdapter adapter = new SqlDataAdapter(cmd); //指定要执行的语句
adapter.Fill(dataset); //将查询到的数据填充到dataset中
DataTable table = dataset.Tables[]; //查询第一张表
for (int i = ; i < table.Rows.Count; i++) //遍历每一行,DataTable包含若干个行
{
DataRow row = table.Rows[i]; //遍历每一行,得到每一行的内容
string name = Convert.ToString(row["Name"]); //查询当前行的 Name 列的数据
MessageBox.Show(name); //显示内容
}
}
}
}
二、DataSet的更新

row["Name"]="xgao"; 更新行
table.Rows.Remove(); 删除行
table.NewRow(); 新增行

    private void button3_Click(object sender, EventArgs e)  //单击事件
{
string Str = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(Str))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_Age";
DataSet dataset = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dataset);
DataTable table = dataset.Tables[];
DataRow row = table.Rows[];
row["Name"]="小高"; //将第一行的 Name 字段,更改为 "小高"
table.Rows.RemoveAt(); //删除第二行
DataRow dr = table.NewRow();//增加新行 SqlCommandBuilder builder = new SqlCommandBuilder(adapter) //自动生成操作命令 adpter.Update(dataset);
}
}
}
}
三、VS自动生成强类型DataSet(类型化DataSet)

有XML架构(XSD)的DataSet
本质上就是DataSet,但多了一个架构的定义

添加 - 新建项 - 数据集
将表从服务器资源管理器拖放到DataSet(数据集)中,注意拖放过程是自动根据表结构生成强类型DataSet等类,
没有把数据也拖过来,程序还是连的那个数据库,自动将数据库连接字符串写在了App.Config中

注意:表一定要设置有主键,被取值的列一定要有值
弱点:当表的字段增加时,就需要重新配置生成

代码中使用DataSet示例(mydo表): mydoTableAdapter adapter = new mydoTableAdapter();
如何得知Adapter的类名?选中DataSet中的下半部分的Adapter,Name属性就是类名,需要右键点击类名 - 解析
取得所有数据:adapter.GetData(),
例子程序:遍历显示所有数据
i<adapter.GetData().Count;
adapter.GetData()[i].Age;

常见问题:类名一般为: 表名+TableAdapter,表名+DataTable,表名+Row,然后用"解析"来填充类名

实验一 :操作 mydo 表,遍历出所有 username 字段的值 ----- 查询

        private void button7_Click(object sender, EventArgs e)
{
mydoTableAdapter adapter = new mydoTableAdapter(); //创建一个TableAdapter
SQL封装.DataSet1.mydoDataTable data = adapter.GetData(); //获取数据,强类型DataTable
for (int i = ; i < data.Count; i++) //遍历数据
{
SQL封装.DataSet1.mydoRow userRow = data[i]; //取得一行
MessageBox.Show(userRow.username); //打印该行的username属性
}
}

SQL封装.DataSet1.mydoDataTable //为什么这么长?因为 mydoDataTable 类是在 DataSet1 类里面定义的

SQL封装: 程序集名称 namespace
DataSet1: 外部类的类名

实验二:操作 T_Age 表,遍历出所有 Name 与 Age 字段的值 ----- 查询

     private void button1_Click(object sender, EventArgs e)
{
T_AgeTableAdapter adapter = new T_AgeTableAdapter();
wf强类型.T_Age.T_AgeDataTable myage = adapter.GetData();
for (int i = ; i < myage.Count; i++)
{
wf强类型.T_Age.T_AgeRow data = myage[i];
string msg = string.Format("姓名:{0},年龄:{1}", data.Name, data.Age);
MessageBox.Show(msg);
}
}

实验三:操作 T_Age 表,修改T_Age表里面的Name值    ------ 更新 Update

       private void button1_Click(object sender, EventArgs e)
{
T_AgeTableAdapter adapter = new T_AgeTableAdapter();
wf强类型.T_Age.T_AgeDataTable myage = adpater.GetData();
for (int i = ; i < myage.Count; i++)
{
wf强类型.T_Age.T_AgeRow data = myage[i];
string msg = string.Format("姓名:{0},年龄:{1}", data.Name, data.Age);
MessageBox.Show(msg);
}
  myage[].Name = "test"; //将表的Name字段的第一条数据改为 test
  adapter.Update(myage); //针对myage表更新数据到服务器上
}

常见问题:错误提示:当传递有已修改行的DataRow集合时,更新要求有交接的UpdateCommand
原因:表中没有加主键,为表中某个字段设置为主键即可

实验四:操作 T_Age 表,往 Name 与 Age 字段插入值 ------- 插入 Insert

       private void button3_Click(object sender, EventArgs e)
{
T_AgeTableAdapter adapter = new T_AgeTableAdapter();
adapter.Insert("zhangsan", ); //直接调用 insert() 方法就可以插入数据
MessageBox.Show("插入成功!");
}

实验五:操作 T_Age 表,删除表里面的某行数据 ------- 删除 delete

        private void button3_Click(object sender, EventArgs e)
{
T_AgeTableAdapter adapter = new T_AgeTableAdapter();
adapter.delete(,"zhangsan", ); //删除指定的数据,比较麻烦,都须要指定
MessageBox.Show("删除成功!");
}

//----------------强类型 DataSet数据的读取

// 强类型 DataSet

NewsDataSet ds = new NewsDataSet();
var daNews = new NewsDataSetTableAdapters.newsTableAdapter();
var daCate = new NewsDataSetTableAdapters.categoryTableAdapter(); daNews.Fill(ds.news);
daCate.Fill(ds.category); this.gv1.DataSource = ds.category;
this.gv1.DataBind(); this.gv2.DataSource = ds.news;
this.gv2.DataBind();

//---------------- 更精简的 强类型 DataSet数据的读取

this.gv1.DataSource = new NewsDataSetTableAdapters.categoryTableAdapter().GetCate();
this.gv1.DataBind();

//----------------强类型 DataSet 的插入,删除,更改

new NewsDataSetTableAdapters.categoryTableAdapter().Insert("测试类型");
new NewsDataSetTableAdapters.categoryTableAdapter().Delete();
new NewsDataSetTableAdapters.categoryTableAdapter().Update("修改后的", );
四、为类型化DataSet增加自己的SQL语句

1.在数据集当中 右键 - 添加 - Query - 使用 SQL 语句 选择操作的类型,如:select,insert,update,delete
如下:保存名为 GetDataByAge
SELECT id, Name, Age FROM T_Age WHERE (Age > @Age)

2.使用

T_AgeTableAdapter adapter = new T_AgeTableAdapter();
wf强类型DataSet.T_Age.T_AgeDataTable data = adapter.GetDataByAge(); //传值
for (int i = ; i < data.Count; i++)
{
wf强类型DataSet.T_Age.T_AgeRow p = data[i]; //只输出年龄大于 30 的
MessageBox.Show(p.Name);
}
五、优化强类型DataSet批量插入数据的时间

在强类型DataSet中,里面所用到的 adapter.Insert(),之类的对数据库进行操作的,它的工作模式如下:

1.插入数据前,先判断连接是否打开,如果没打开,则打开
2.完成数据插入后,再判断,原先(不是程序自动打开的那个)的连接是否关闭,如果关闭则关闭,否则将继续打开

默认连接是关闭的,所以当插入数据的时候会这样工作:

1.自动打开连接,插入数据
2.完成数据插入后,发现原现的连接是关闭的,所以则关闭

从中可以看出我们只要在程序判断前,将连接打开,后面程序将不会自动关闭连接,如果在做批量插入的时候,可以在循环语句前,先将连接打开,循环后,再将连接关闭,这样将会大大加快数据的插入所耗时间

实例:
新建一个 Stopwatch 表,字段为 id int,Name nvarchar(20),Age nvarchar(20)

没有做优化前,总耗时 12 秒, 做优化后,总耗时 2 秒

private void button1_Click(object sender, EventArgs e)                //单击事件
{
Stopwatch sw = new Stopwatch();
sw.Start(); StopwatchTableAdapter adapter = new StopwatchTableAdapter(); adapter.Connection.Open(); //循环前,先打开连接
for (int i = ; i < ; i++)
{
adapter.Insert(i.ToString(), i.ToString(), i.ToString()); //插入数据
}
adapter.Connection.Close(); //循环后,再关闭连接
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString()); //输出耗时时间,以秒为单位
}

在已建好的DataTable中添加一列数据

  public DataTable GetOneTwoNum()
{
DataTable dt = SoftwareTypeBLL.GetOneTwoNum(); // 获得一个DataTable
DataColumn dc = new DataColumn("TwoName", typeof(System.String)); // 设置一列
dt.Columns.Add(dc); // 将一列添加到 Datatable 中 foreach (DataRow row in dt.Rows)
{
string TwoStr = "随便内容";
row["TwoName"] = TwoStr; // 将新内容添加到指定的列
}
return dt; //返回修改后的 DataTable
}

【ADO.NET】8、DataSet的使用的更多相关文章

  1. 第九周学习笔记-ADO&period;Net中DataSet的应用

    一.知识点描述 1.含义:DataSet是ADO.Net的断开式结构的核心组件,它可以用于多种不同的数据源,用于XML数据,或用于管理应用程序本地的数据.DataSet包含一个或多个DataTable ...

  2. ADO&period;Net中DataSet的应用

    一.知识点描述 1.DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.也就是说,即使断开数据链路,或者关闭数据库,Data ...

  3. ADO&period;NET中DataSet、DataTable、DataRow的数据复制方法

    DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据 ...

  4. ADO&period;NET获取数据(DataSet)同时获取表的架构

    普通的ADO.NET获取DataSet的写法如下: using System.Configuration; using System.Data; using System.Data.SqlClient ...

  5. 你必须知道的ADO&period;NET

    原文:http://www.cnblogs.com/liuhaorain/archive/2012/02/06/2340409.html 1. 什么是ADO.NET? 简单的讲,ADO.NET是一组允 ...

  6. &lbrack;翻译&rsqb;比较ADO&period;NET中的不同数据访问技术(Performance Comparison&colon;Data Access Techniques)

    Performance Comparison: Data Access Techniques Priya DhawanMicrosoft Developer Network January 2002 ...

  7. ADO&period;NET 快速入门(六):读写 XML

    ADO.NET 和 DataSet 可以读写 XML Schema 和 XML.获取更多信息,请参考 How do I...Use XML and the DataSet?   DataSet 的 S ...

  8. 一个Entity Framework、ADO&period;NET查询性能测试

    Entity Framework自然是会比ADO.NET性能慢点,这个不多说了.直接上结果. 本该用测试项目的,不过我建了个aspx.下面是随便测20遍得到的结果 补充!!把12行改成 list = ...

  9. dynamic遇上ADO&period;NET

    传说中的dynamic dynamic是个不合群.不按规则办事的家伙,可以说是个异形,但更恐怖的是它又是无所不知的,任何事情都难不了它(咳咳,它似乎与Lambda表达式是死对头).这令人想起<死 ...

  10. ADO&period;NET数据库编程

    ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...

随机推荐

  1. WKWebView比UIWebView优越性

    1.在使用两者的过程中发现前者比后者节省内存一倍多,WKWebView 是苹果在 iOS 8 中引入的新组件,目的是给出一个新的高性能的 Web View 解决方案,摆脱过去 UIWebView 的老 ...

  2. 最快让你上手ReactiveCocoa之进阶篇

    前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...

  3. 案例研究:CopyToAsync

    返回该系列目录<基于Task的异步模式--全面介绍> 把一个流拷贝到另一个流是有用且常见的操作.Stream.CopyTo 方法在.Net 4中就已经加入来满足要求这个功能的场景,例如在一 ...

  4. vi&sol;vim使用小结

    1.三种模式: •Command mode 命令模式,用于输入命令,简单更改. •Insert mode 插入模式,用于插入文本. •Last line mode 末行模式,用于输入命令.视化操作.查 ...

  5. normal&period;1

    11 # coding:utf-8 def maxnum(ipstr): ipstr = ipstr.split(' ')[1] return ipstr def minnum(ipstr): ips ...

  6. phantomjs使用说明

    phantomjs使用说明 12条评论   phantomjs实现了一个*面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取. ...

  7. 视图--bai

    /*视图的必要性 create view population_all_view as select xxxx 详细信息 from qgck where rownum<500 -- sql语句不 ...

  8. 如何处理JS与smarty标签的冲突

    smarty的默认标记符是大括号:{}, 假如我们页面上有JS且定义了函数或者对象,或者有CSS定义了样式,就会出现大括号, smary引擎就会把这些大括号当作smarty语法来解释, 很明显,这些C ...

  9. Creating Contextual Menus创建上下文菜单

    A contextual menu offers actions that affect a specific item or context frame in the UI. You can pro ...

  10. 如何给grldr&period;mbr和grldr改名

    grldr修改方法: 比如要把grldr 改成gzldr :1.先把文件名改成gzldr:2.用ultraedit或winhex打开gzldr:3.虽然文本框全都是乱码,别管它,把光标定位在右边文本框 ...