高难!DataSet更新视图问题:有没有办法不用指定 Insert、Update、Delete命令?
DataSet更新视图时出现异常,说“对于多个基表不支持动态 SQL 生成。”就是说StringBuilder没能正常生成SQL语句了?
但是在企业管理器中可以直接修改同一视图中某一单元格的名字,不用给出什么InsertCommand、UpdateCommand、DeleteCommand之类的。这是怎么实现的呢?
问题点数:100、回复次数:11Top
1 楼chenlixin007(Aeolus)回复于 2005-06-30 22:45:13 得分 20
说实在的,DataSet非常不灵活,我一般直接操作数据库Top
2 楼saucer(思归)回复于 2005-06-30 22:51:13 得分 0
企业管理器不是用ADO.NET机制的,在ADO.NET里,你需要自己写这些命令,或者,确认你的表有个主键,并且这个主键也在SELECT语句里,然后用个CommandBuilder
SqlCommandBuilder cb = new SqlCommandBuilder(YourDataAdapter);
YourDataAdapter.Update(...);
Top
3 楼Airblack(C#疯子)回复于 2005-06-30 23:00:45 得分 0
saucer,好久不见了,你小子还好吧?是不是觉得编程很没意思呢?很无聊的日子每天都在继续。似乎到处都是高深的学问,殊不知这些都是些工具,真正精髓的只有你写的算法。bs那些天天谈什么web service,xml的垃圾。学会c语言开发都够了。Top
4 楼sarcophile(食肉动物)回复于 2005-06-30 23:08:36 得分 0
思归大侠到场,蓬荜生辉。不过问题是: 我用的是视图,能否建立主键?如果不能,有没有别的办法?一定要指定InsertCommand、UpdateCommand、DeleteCommand之类的吗?Top
5 楼sarcophile(食肉动物)回复于 2005-06-30 23:15:42 得分 0
忘了说,原先 表 中是有主键的,但做成视图后因为交叉组合,主键那一列的值已经不唯一了,这样Fill时就用 MissingSchema = Add, 而不是用 AddWithKey,否则fill会失败。
那么能不能在视图中新建一列作为主键呢?Top
6 楼saucer(思归)回复于 2005-06-30 23:36:23 得分 40
I don't think ado.net supports updatable view, time to write your own insert/update/delete, with stored procedures, probably, see
also see
http://www.theserverside.net/articles/showarticle.tss?id=OptimizingADONETTop
7 楼guishuanglin(蓝色枫林)回复于 2005-06-30 23:49:19 得分 10
楼主你算走运,我刚搞定这方面东东,可能是你没有解ADO.ent吧
DataView对象,生成SQL语句是是DataAdapterp这个对象,不是DataSet,
生成SQL条件:1必须提供Select语句
2,要生成其它SQl语句,select语句必须是同一个表,而且必须是要有主键在内
DataView创键条件:
1,.net里的DataView不如数据库的视图,不可以是我个查询语,也就是说只能是从单个
查询语句中得到的数据,
2,在数据库里可以主键外键表等多个表生成一个视图,而DataView只能是一个表,
这个表可以是DataSet中的任何表,或者手工建的表也行,但就是不能把多个表合成你想要的“视图”
记住:只能是一个表做DataView的数据源.
=====
你要明白DataView是用来查询,DataTbale的,是用来排序,是用来过滤,是用来查找(可以是任意唯的列,但要先指定,如果是查找表,那只能是主键),是用来把表里的数据的一小部分显示出来等等用的。不完全等同于数据库里的视图!!Top
8 楼guishuanglin(蓝色枫林)回复于 2005-06-30 23:58:54 得分 0
把数据库的视图当做DataView数据源是可以的,国为视图对于DataView来说只是一个表,
你想把数据库的相关表都读到DataSet中,然后做成你要的”视图“,把ID换成名称那种,呵呵,
这个是不行的,只能是在数据库里,
不过,如果你把数据都取出来,通过手工可以建成你想要我视图,但这样太不好搞。
一个小经验:
如果想取得外键表中的名称,只要你把主,外键表数据都取出来的,放在DataSet里,
可以把外键表建个DataView,然后做一个,通过外键ID找显示名称的过程,
用ID到外键表对应的DatqaView查找,就可以取到对应的名称,然后显示,
Top
9 楼guishuanglin(蓝色枫林)回复于 2005-07-01 00:02:42 得分 0
提示:
因为外键不是主健,所有必须要在视图中查找,
先设定DataView.sort = "排序列",
排序列要是唯一的,如果找到多行,等于没找到,不返回任何行索引。Top
10 楼zeusvenus()回复于 2005-07-01 00:25:45 得分 30
ADO.NET1.1一下版本不能直接做到你需要的东西;
还是得去数据库写脚本。Top
11 楼sarcophile(食肉动物)回复于 2005-07-01 08:19:17 得分 0
guishuanglin(小桂子): 非常感谢你的耐心解答,不过很可惜,你没看明白我的问题。你解答的内容我基本都知道的。我问的是数据库中的视图,不是System.Data.DataView。
chenlixin007(Aeolus):这东西虽然麻烦事一大堆,但还是比直接操作数据库方便些。我用的是自己做的ORM,设计ORM时大部分考虑的是直接操作数据库,但实际使用时恰恰相反,大部分用的是DataSetTop




