none
使用SqlCommandBuilder自动生成SQL语句的问题 RRS feed

  • 问题

  • SqlDataAdapter adapter = new SqlDataAdapter("select * from ZJLY_JQ_Account", connectionString);
    sqlCBuilder = new SqlCommandBuilder(adapter);

    我这些生成出来的SqlCommandBuilder,得到的Update语句是
    UPDATE [ZJLY_JQ_Account] SET [SID] = @SID, [AccountType] = @AccountType, [Account] = @Account, [AccountKey] = @AccountKey WHERE (([ID] = @Original_ID) AND ((@IsNull_SID = 1 AND [SID] IS NULL) OR ([SID] = @Original_SID)) AND ((@IsNull_AccountType = 1 AND [AccountType] IS NULL) OR ([AccountType] = @Original_AccountType)) AND ((@IsNull_Account = 1 AND [Account] IS NULL) OR ([Account] = @Original_Account)) AND ((@IsNull_AccountKey = 1 AND [AccountKey] IS NULL) OR ([AccountKey] = @Original_AccountKey)))
    在我的数据库表中
    只有ID是主键,为什么Where后面会有那么多的条件,如何使自动生成的语句where后面的语句只根据主键来更新
    2010年9月3日 10:06

答案

  • WHERE 语句中的很多部分,是为了保证更新时,不会更新到旧数据。虽然,SID 就可以确定需要更新的行,但此时,在更新之前,必须确保更新时,没有其他代码操作这一条记录。因此,WHERE 中必须保证更新的是没有经过修改的原始记录。这是对并行支持的一种实现,我们称之为 Optimistic Concurrency。
    Mark Zhou
    2010年9月3日 10:21

全部回复

  • WHERE 语句中的很多部分,是为了保证更新时,不会更新到旧数据。虽然,SID 就可以确定需要更新的行,但此时,在更新之前,必须确保更新时,没有其他代码操作这一条记录。因此,WHERE 中必须保证更新的是没有经过修改的原始记录。这是对并行支持的一种实现,我们称之为 Optimistic Concurrency。
    Mark Zhou
    2010年9月3日 10:21
  • 其实我只想用这个进行动态生态SQL语句,没有其他的要求,有没有什么办法可以解决这个问题呢,
    2010年9月3日 15:32
  • 手动改update查询,不过每次生成的时候会覆盖掉,我一般都是写一个Update用的存储过程然后加到table adapter

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月3日 15:37
    版主
  • 其实我只是想把一个实体对象,根据反射,把各个值自动绑定到自动生成的SQL语句中,这样数据库设计改变了,我只需要改变Model层就行了。select 和Insert都已经成功了,只有Update生成的where语句不成功。看了上面的说法,也知道了为什么要这么设计,看来只能手工生成SQL语句了
    2010年9月3日 16:01
  • 还有delete语句也是一样的问题

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月3日 16:57
    版主