当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 近几天对DataSet的新认识

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

ASP.NET 中的 近几天对DataSet的新认识


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 85 ::
收藏到网摘: n/a

做管理软件总是在和DataTable,DataSet,DataGridView打交道,以前经常用,但是自己思考的问题不多,用的都是最笨的方法,做出来的都是最丑陋的界面和低效率的程序,上周某天晚上把DataGridView认真的研究了一下,主要是界面上的东西,觉得被我改进后的界面看起来就是不一样了,呵呵~我觉得看起来还可以的界面代码:
复制代码 代码如下:

DataGridViewCellStyle style = new DataGridViewCellStyle(); //自定义一种单元格样式.
style.BackColor = Color.LightCyan; //其实就是换种颜色.
dataGridView1.RowHeadersVisible = false; //觉得显示在行头的那个方块不好看,去掉~
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //单击某个单元格,选中其所在的行,这样看数据蛮方便.
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //用户不能调整列标题栏的大小.
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //列宽度样式,最长的数据能全部显示,这样就不会出现"....."了.
dataGridView1.AlternatingRowsDefaultCellStyle = style; //奇数行的样式设置为先前定义的样式,让相邻行有颜色反差.

还有很多效果没用~但是这样简单的几行还是能蛮大的改善程序的美观性~
然后说说数据绑定的新认识,以前一直知道这东西,但不知道怎么用,也没花时间去研究,但是这些天在CSDN的论坛里逛时,好象很多人都用这方面问题,才让我有动力去研究这些用法.哎~有时候觉得自己蛮懒的~经常要做数据处理方面的东西,竟然还是今天才第一次对它有深入的了解~惭愧!!
说说具体的实现过程吧~连接SQL Server数据库的SqlConnection和SqlCommand必不可少~其次是SqlDataAdapter(其实这个也经常用,但用的只是用它来读数据),其实这个数据适配器用处很大,使用它可以很方便的从数据库里读取数据,通过DataGridView显示给用户,用户修改DataGridView里的数据后,再通过SqlDataAdapter可以把修改的数据反映到数据库里,期间不需要我们写任何操作数据库代码,.Net框架给我们包办!而且这些数据只是存储在DataSet或者DataTable这样的缓存中,不用一直保持数据库连接~哦~忘了,还需要使用SqlCommandBuilder来自动生成一些修改的SQL语句,简单的实现代码如下:
复制代码 代码如下:

DataSet ds = null;
SqlDataAdapter adapter = null;
SqlCommandBuilder sqlbuilder = null;
//该按钮读取数据,并绑定数据
private void button1_Click(object sender, EventArgs e)
...{
ds = new DataSet();
SqlConnection cn = new SqlConnection("Data Source=.;User ID=sa;Password=0;Initial Catalog=BMIS");
SqlCommand cm = new SqlCommand();
adapter = new SqlDataAdapter(cm);
sqlbuilder = new SqlCommandBuilder(adapter);
cm.Connection = cn;
cm.CommandType = CommandType.Text;
cm.CommandText = "select * from [providerInfo]";
adapter.Fill(ds); //该方法把得到的数据放入一个DataTable中
dataGridView1.DataSource = ds.Tables[0]; 把数据绑定到DataGridView
}
//向数据库返回修改的数据.
private void button2_Click(object sender, EventArgs e)
...{
adapter.Update(ds);
}
用户在DataGridView中做的数据改变会反映到它所绑定的DataTable里,最后使用SqlDataAdapter的Update方法,把修改反映到数据库中,感觉使用的DataTable是一个中间存储数据工具,而SqlDataAdapter是一个中间数据操作工具,两者结合起来完成更新数据源的任务.
现在我想说一下这段代码运行后在SQL Server里具体做的是什么事情.首先,假设我在DataGridView显示数据后,修改了一行数据,增加了一行数据.打开SQL Server的事件探察器,对一次操作做了全程的监听.登录,执行查询语句并无二样,但是当我执行一次Update时,都会调用一个名为sp_reset_connection的存储过程,看名字猜想应该是连接数据库的意思,然后针对每一行修改的数据执行一个名为exec sp_executesql的存储过程,更新数据库,比如我修改一行后的数据得到的是这么一条语句"exec sp_executesql N'UPDATE [providerInfo] SET [telNo] = @p1 WHERE (([id] = @p2) AND ([name] = @p3) AND ((@p4 = 1 AND [address] IS NULL) OR ([address] = @p5)) AND ((@p6 = 1 AND [telNo] IS NULL) OR ([telNo] = @p7)) AND ((@p8 = 1 AND [tradeSum] IS NULL) OR ([tradeSum] = @p9)) AND ((@p10 = 1 AND [remark] IS NULL) OR ([remark] = @p11)))', N'@p1 varchar(3),@p2 int,@p3 varchar(2),@p4 int,@p5 varchar(3),@p6 int,@p7 varchar(4),@p8 int,@p9 int,@p10 int,@p11 varchar(3)', @p1 = '110', @p2 = 1, @p3 = 'WT', @p4 = 0, @p5 = 'ABC', @p6 = 0, @p7 = '0000', @p8 = 0, @p9 = 8, @p10 = 0, @p11 = 'AAA'",
而新增一行的语句是"exec sp_executesql N'INSERT INTO [providerInfo] ([name], [address], [telNo], [tradeSum], [remark]) VALUES (@p1, @p2, @p3, @p4, @p5)', N'@p1 varchar(2),@p2 varchar(8000),@p3 varchar(8000),@p4 int,@p5 varchar(8000)', @p1 = 'TT', @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL"
这样看起来就比较明白SqlDataAdapter的工作机制了,记录下发生变化的行,通过SqlCommanBuilder生成相应的SQL语句,再执行,达到修改目的.
但是我做了一下对多表关联的得到的数据进行修改,很遗憾,修改是不成功的,其实也不应该成功,比如我在学生信息的导师的字段里存的仅仅是老师的ID,而显示的是根据导师信息表关联后导师的真实姓名,用户如果修改了导师的姓名,反应到学生表里的不可能是老师的ID,修改也就不成功.相信这个问题是有解决办法的,只是我还没发现,应该继续研究!
最后,罗嗦几句说说今天的事情.下午体育课测50米,在抢跑的情况下跑了个6秒2~有点假~下课后和大一的几个院队的同学打球~打到5点~回来去澡堂洗澡我真怕我摔在澡堂里~实在没力气了~不过跟他们打球心情还是很好的,首先他们打球不菜,讨厌和菜的人打~其次他们充满活力的样子让我好象也回到了大一的感觉~天天打球的生活真好!明天早上英语课默单词~~不想去了~~所以今晚决定stay up coding!!!还好还有点吃的~