近几天对DataSet的新认识
程序员文章站
2022-06-12 20:32:23
做管理软件总是在和datatable,dataset,datagridview打交道,以前经常用,但是自己思考的问题不多,用的都是最笨的方法,做出来的都是最丑陋的界面和低效...
做管理软件总是在和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!!!还好还有点吃的~
复制代码 代码如下:
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);
}
现在我想说一下这段代码运行后在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!!!还好还有点吃的~