现状:
使用了DbCommandBuilder来动态生成SQL语句给了数据适配器
adapter.UpdateCommand = builder.GetUpdateCommand( );
adapter.InsertCommand = builder.GetInsertCommand( );
adapter.DeleteCommand = builder.GetDeleteCommand( );然而这么做必须要求当前操作的数据库表必须拥有主键,否则,需要手写update,insert,delete的语句,不然则会引发System.InvalidOperationException异常(对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。),然而手写语句就相当麻烦了,而且表太多的情况下,逐一设置主键也不合适,所以征求有什么好的意见,不需要提供主键则可以动态生成SQL。。如果用LINQ做的话,可以实现么?此问题困扰很久了,希望能得到些许指点再次谢过

解决方案 »

  1.   

    不是吧没人能来看看啊 SQL codeselect @@ version
      

  2.   

    不行的,因为大多数情况对数据库的更新或者删除是基于主键的,否则如果你把DataTable里两条记录搞成一样,将来DataSet提交到数据库是怎么知道你更新的是那条记录?
      

  3.   

    而对于某些场合,由于客户的层次不同,对于数据库了解的多少也不同,客户通常在建数据库表的时候,并未设置主键,所以必须在程序底层考虑到现在我是将数据库表中的信息读取放入DataSet中,然后将其绑定到DataGridView,将数据显示给用户,而对数据库的所有操作都是通过Adapter适配器来完成的,SQL语句是由DbCommandBuilder动态生成的,这样的话,对于无主键的表,则异常,因为用户所操作的数据库和表均是由用户自己选择的,所以,如果手工写command语句,则会相当麻烦,而且或许有处理不到位的地方,所以,我想请问,除了让用户必须指定主键和手工写语句两种方法,在此情况下还有其他的处理方式么?例如,控件在对表进行操作时,先检验表是否有主键,如没有,则程序底层指定第一字段为主键,这种做法不知可行否?
      

  4.   

    To : kssys不是我有意这么去做,我也知道设计数据库表的时候,尽量设置主键但,在某些行业,产品的使用人群层次并不是很了解这些东西,人们在建库表的时候,只是一味的仅仅要求可以存储数据而已,所以,对于主键,并不是很理解,故而很难让用户特意的去设定主键。既然用户不想设置主键,所以,必须由我们来处理这种无主键的情况,这点也就是我要解决的地方,而并非刻意忽视主键。
      

  5.   


    -_-那么恐怕只能写一个根据RowState来自动产生SQL的方法了。