全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4620
推到 Plurk!
推到 Facebook!

傳回自動累加的欄位之值

 
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-03-21 11:46:35 IP:203.73.xxx.xxx 未訂閱
在資料庫有二個欄位,一個為自動累加(in SQL_Server: Identity) Table1(ID, FChar), ID為Identity, 當下: Insert into Table1(FChar) values("bb")時, ID就會自動累加! 請問,如何取得Insert這筆資料的ID? PS:FChar為可重覆! 之前是在Insert之後下Select Max(ID)來取得, 但在多人環境之中,不保證在這兩個SQL不會被 其他人插進去,而得到錯誤的值。 曾經想用Transcation來保護,但又覺得不大像。 Transcation是確保交易的完整性…… 不曉得有什麼好方法來解決?
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-03-22 00:04:19 IP:61.59.xxx.xxx 未訂閱
也許可以先取得最後一筆ID,再寫入含(ID 1,"bb")的資料...
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-03-22 06:34:13 IP:61.219.xxx.xxx 未訂閱
引言: 也許可以先取得最後一筆ID,再寫入含(ID 1,"bb")的資料...
可是如此做的話, 在取得最後一筆ID與再寫入含(ID 1,"bb")的資料中間, 萬一有其他的Client端User也插入得最後一筆ID, 那這兩個Client端是不是會取得相同的ID? 大家想想,怎麼辦????? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-03-22 13:46:53 IP:61.59.xxx.xxx 未訂閱
應該不會吧~~~ 這個ID不是要唯一鍵值嗎?!寫不成功就重新做取ID的動作... 不會有重複 成功的動作... 不過,如果資料庫變動頻煩..可能就不適用了!! 不曉得什麼樣的需求,會造成像這種 又用自動編號、又想知道自己寫入的編號.. 不是寫入成功就好了嗎?! 只是感到困惑,能否請大家教我一下下..資料庫實務經驗很少..thx~
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-03-24 22:14:35 IP:61.30.xxx.xxx 未訂閱
另建一table,儲存1 intger,每次要新增一筆記錄時,先將此integer 1 ,再抓回去,當成新增紀錄之累加欄位值,。 記得integer 1,及抓值要用store procedure,才可在多人使用時,避免 鍵值重複之現象 Kadee_BigRed
------
Kadee/BigRed Ent.
www.tw165.com
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-03-25 09:23:35 IP:203.73.xxx.xxx 未訂閱
引言: 另建一table,儲存1 intger,每次要新增一筆記錄時,先將此integer 1 ,再抓回去,當成新增紀錄之累加欄位值,。 記得integer 1,及抓值要用store procedure,才可在多人使用時,避免 鍵值重複之現象
請問一下: "記得integer 1,及抓值要用store procedure",為什麼在多人使用時, 可以避免鍵值重複? 我記得store procedure並不會保證其內執行的SQL是Lock的
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-03-25 09:30:05 IP:61.219.xxx.xxx 未訂閱
我用ORACLE資料庫時, 採用TTable並將Exclusive設定為True 則同一時間只有一台電腦可以open此Table 如:
   repeat
      ok:=true;
      try 
        ttable1.open;
      execpt 
         ok:=false;
      end;
   until ok;
但此法不適用MS-SQL/ACCESS 已知可用於Oracle/Interbase ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-03-26 01:38:01 IP:61.10.xxx.xxx 未訂閱
用 StoredProc 來新增 Record: 假設 FChar 的 Data Type 是 varchar(20), 則... Create procedrue AddTable1 @FChar varchar(20), @RefNo integer output as begin insert into Table1(FChar) values(@FChar); select @RefNo = @@identity; end 然後在 Query Analyzer 中作測試: declare @n integer; execute AddTable1 'bb', @n; print @n; 正常情況下, 你能看到新增之號碼, 那就是成功了。那麼在 Delphi 中用 TStoredProc 中自能取得新增之號碼: function AddTable1(FChar: String): Integer; with StoredProc1 do begin ParamByName('@FChar').AsString := 'bb'; ExecProc; Result := ParamByName('@RefNo').AsInteger; end; end; 沒測試過的 Code, 可能要 Debug 一下吧, 但不會大錯的.
------
--
小卜子
paul
初階會員


發表:8
回覆:82
積分:28
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-04-16 08:29:46 IP:203.204.xxx.xxx 未訂閱
每個人都有每個人的解決,我的解決如下: 1.先建一個 Table 存放 變數和編號 2.第一次先用唯讀的方式取得該 變數的編號 3.實際寫入(儲存)異動前,再取一次該變數的編號,若編號沒變則隨即把編號 1後寫入(儲存),若有變動則以新取出的編號 1寫入(儲存),然後把現行異動編號改成新取出的編號. 這部份的處理主要關鍵在於若資料庫可作 lock 處理,會更完美,若沒有 lock,有時會碰到網路傳輸太慢所導致的問題,亦可再加入 try except end的控制來避免編號重覆的問題.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-15 09:41:39 IP:203.203.xxx.xxx 未訂閱
引言: 每個人都有每個人的解決,我的解決如下: . .
曾經幫之前公司的客服部門寫一個客戶來電留言紀錄系統,其中有一項作業是紀錄來電客戶,問題描述,負責的客服人員哪位,回電沒有等等,這項作業開了一個table去紀錄,primary key我很異想天開的用年月日時分秒存成字串當成單號來記錄,資料庫是sql server,同時上線的client有七個之多,離職後偶爾有回去maintain一下系統,還沒有發生存檔時單號重複的問題. 之所以這麼做是因為有想到,每個人按下存檔的時間都不一樣,當然前提是每台電腦的系統時間都一樣,又若各台電腦的系統時間不一樣,要有兩台以上的電腦再存檔時會那麼祝係剛好同一個時間連秒都一樣,那可能可以去買張彩券或刮刮樂.
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-16 03:13:00 IP:61.221.xxx.xxx 未訂閱
引言: 在資料庫有二個欄位,一個為自動累加(in SQL_Server: Identity) Table1(ID, FChar), ID為Identity, 當下: Insert into Table1(FChar) values("bb")時, ID就會自動累加! 請問,如何取得Insert這筆資料的ID? PS:FChar為可重覆! 之前是在Insert之後下Select Max(ID)來取得, 但在多人環境之中,不保證在這兩個SQL不會被 其他人插進去,而得到錯誤的值。 曾經想用Transcation來保護,但又覺得不大像。 Transcation是確保交易的完整性…… 不曉得有什麼好方法來解決?
若是 MS SQL Server 的話, 有一個 @@Identity 變數可以用!! 在 query 的 sql command 中.輸入如下:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.ADD('Set NOCOUNT ON;');
Query1.SQL.ADD('Insert into Table1(FChar) values(''bb'');');
Query1.SQL.ADD('Select @@Identity As SNO');
try
  Query1.Open;
  iSNO := Query1.FieldByName('SNO');
except
  Showmessage('新增資料失敗!');  
end;
如此一來就一定是得到新增資料的 identity 流水號了哦!!
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-16 16:32:37 IP:61.216.xxx.xxx 未訂閱
在BeforePost前在取下Select Max(ID)來取得, 這樣會不會好一點???
引言: 之前是在Insert之後下Select Max(ID)來取得, 但在多人環境之中,不保證在這兩個SQL不會被
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-16 20:59:53 IP:61.221.xxx.xxx 未訂閱
引言: 在BeforePost前在取下Select Max(ID)來取得, 這樣會不會好一點???
引言: 之前是在Insert之後下Select Max(ID)來取得, 但在多人環境之中,不保證在這兩個SQL不會被
不論是在之前或是在之後來 select max(id) 都會發生問題, 因為時間差的現導致同時取得相同的 max(id). 所以一般最佳 的解決方法是利用 table lock 的方法 (table 獨佔) 來進行 新增並取得該 identity 的資料. 不過在 MS SQL 中的 @@Identity 變數就是在處理這個 identity 欄位於新增資料時所產生的流水號..
系統時間:2024-04-29 13:48:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!