有三張表,A、B、C,查詢是使用SELECT A.A1,A.A2,A.A3,B.B1,B.B2,B.B3,C.C2 FROM A INNER JOIN B ON A.A1=B.B1
INNER JOIN B.B2=C.C1 WHERE A.A1='條件',但我更新時只要更新A表,并不要更新,B表,C表。請教大家使用ADOQUERY,如何解決。萬分感謝。
uj5u.com熱心網友回復:
在一個Query控制元件中,聯合查詢的結果資料集是只讀的,你不能使用Query.Edit進行更新。想要更新,只能再寫一個SQL陳述句。
uj5u.com熱心網友回復:
更新只能擔保更新,自己執行update陳述句uj5u.com熱心網友回復:
SELECT A.A1,A.A2,A.A3,(select B.B1 from B where B.B1=A.A1) as B1,(select B.B2 from B where B.B1=A.A1) as B2 FROM A這樣就可以使用Query更新A的欄位了
如果覺得這樣寫不簡潔 可以考慮用函式實作 具體寫法根據資料庫不一樣略有不同
形式如下
SELECT A.A1,A.A2,A.A3,getB1(A1) as B1,getB2(A1) as B2 FROM A
uj5u.com熱心網友回復:
如果更新的欄位只在A表中,并且A表有主鍵。這就有很大可能可以更新了。uj5u.com熱心網友回復:
如果是BDE,用UpdateSQL輕松搞定。但是ADO就沒有這么簡單。
ADO的聯合查詢的(指定表)更新方法:
1:用獨立的SQL陳述句更新(其他方法歸根結底還是使用的這個方法)。
2:在ADO組件和DataSource組件之間擴展。
方法1(用自帶組件,發布時要加入Midaslib單元):TADOQuery+ TDataSetProvider+ TClientDataSet+ TDataSource ;
關鍵: 1 TDataSetProvider的onGetTableName事件設定要更新的表名稱,TableName='xxx';
2 雙擊TADOQuery設定每個欄位的ProviderFlags屬性。
方法2(用EHlib組件,功能強大,但是速度慢):TADOQuery+ TADODataDriverEh+ TMemTableEh+ TDataSource ;
這個更類似BDE的UpdateSql功能,雙擊TADODataDriverEh進行設定就可以了。
uj5u.com熱心網友回復:
可以通過clientdataset和datasetprovider配置更新方式和查詢下來的欄位型別是否關鍵欄位,是否是要更新表的欄位uj5u.com熱心網友回復:
系統會自動更新,不需要寫sql代碼。uj5u.com熱心網友回復:
一個表一個query就可以了吧,當然之后的datasource也得跟不同的query配套使用uj5u.com熱心網友回復:
在需要更新時加這個就可以了,adoquery1.Requery()
uj5u.com熱心網友回復:
再使用一個ADOQuery對指定資料進行更新
uj5u.com熱心網友回復:
這個問題我之前也問過了,還是寫SQL陳述句更新吧轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101779.html
標籤:數據庫相關
