TField.ProviderFlags

探讨了TField.ProviderFlags在组SQL中的关键作用,详细解释了如何通过正确设置ProviderFlags和UpdateMode来避免更新时的数据冲突,确保主档字段的正确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TField.ProviderFlags,这对于组 SQL 来说至关重要!

ProviderFlags 是 TProviderFlag 的集合,我们来看看 ProviderFlags 可以包含哪些元素
        元素名称 说明  备注
pfInUpdate INSERT / UPDATE 要包含此字段 实际上会不会包含,要看字段值有没有变动而定
pfInWhere UPDATE / DELETE 时要加入 WHERE 实际上会不会加入 WHERE,要看字段值有没有变动而定
pfInKey UPDATE / DELETE 时要加入 WHERE,以及 DataSet 内数据的重复检查 一定会加入WHERE
pfHidden 隐藏字段,仅作为保存数据用途,避免数据冲突,外界无法使用  

另外,还有一个跟组 SQL 有关的重要属性:TDataSetProvider.UpdateMode
属性值 说明
upWhereAll 所有字段均会加入 WHERE
upWhereChanged (有变动,且有 pfInWhere 的字段) OR (有 pfInKey 的字段),会加入 WHERE
upWhereKeyOnly 只有 pfInKey 的字段会加入 WHERE

这两个属性决定了组 SQL 的结果
例如:select A.A1, A.A2, A.A3, B.B4 from TABLE_1 A  inner join TABLE_2 B on A.A1=B.B1
有四个字段 A1, A2, A3, B4,A1 是 A  的 PK
但是更新时只要更新 A 的字段,不要更新 B 的字段

如果完全依照默认值,各字段的 ProviderFlags 都是 [pfInUpdate, pfInWhere]
DataSetProvider.UpdateMode 为 upWhereAll
当 UPDATE 时,B4 会组进 SQL,但 B4 并不是 A 的字段,所以会发生错误

于是 ProviderFlags 的设法应该为:
A1 = [pfInKey, pfInUpdate]
A2 = [pfInUpdate]
A3 = [pfInUpdate]
B4 = []
而且 DataSetProvider.UpdateMode 设为 upWhereKeyOnly
这样 B4 就不会加入 UPDATE 的 SQL,就 OK 了

不管 JOIN 几个 TABLE,设定 ProviderFlags 的原则为
主檔 PK 字段要有 pfInKey
主檔需要 UPDATE 的字段要有 pfInUpdate
主檔不需要 UPDATE 的字段,以及所有 JOIN 进来的字段就给他 空集合

要设定在 DataSetProvider.DataSet 指到的 DataSet 里面的 Field 才行

 

public void actionPerformed(ActionEvent e) { String username=uField.getText().trim(); String password =pField.getText().trim(); String phonenum=tField.getText().trim(); String gender=bg.isSelected(maleBtn.getModel())?maleBtn.getText():femaleBtn.getText(); String Driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/data2?characterEncoding=UTF8&useSSL=false"; Connection conn = null; try{ Class.forName(Driver); conn = DriverManager.getConnection(url, "root", "yxh9497"); Statement stmt=conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM userinformation"); while(rs.next()) { if(username==rs.getString(username)) { JOptionPane.showMessageDialog(null, "用户名已被注册"); break; } } String sql1="insert into userinformation values('"+ username+ "','"+password+"','"+phonenum+"','"+gender+"')"; int a= stmt.executeUpdate(sql1); }catch(Exception ex){ ex.printStackTrace(); } try{ //关闭数据库联接类 conn.close(); }catch(Exception ex){ ex.printStackTrace(); } JOptionPane.showMessageDialog(null, "注册成功"); jf.setVisible(false); new GUI().init();}我想在当用户名重复时,不再执行String sql1="insert into userinformation values('"+ username+ "','"+password+"','"+phonenum+"','"+gender+"')"; int a= stmt.executeUpdate(sql1); }catch(Exception ex){ ex.printStackTrace(); } try{ //关闭数据库联接类 conn.close(); }catch(Exception ex){ ex.printStackTrace(); } JOptionPane.showMessageDialog(null, "注册成功"); jf.setVisible(false); new GUI().init();}这些语句,该怎么办
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值