傳回自動累加的欄位之值 |
|
小蟲蟲
一般會員 發表:38 回覆:55 積分:23 註冊:2002-03-13 發送簡訊給我 |
在資料庫有二個欄位,一個為自動累加(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 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
peipei36
一般會員 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
|
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
|
小蟲蟲
一般會員 發表:38 回覆:55 積分:23 註冊:2002-03-13 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
Diviner
初階會員 發表:36 回覆:112 積分:34 註冊:2002-03-13 發送簡訊給我 |
用 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 發送簡訊給我 |
每個人都有每個人的解決,我的解決如下:
1.先建一個 Table 存放 變數和編號
2.第一次先用唯讀的方式取得該 變數的編號
3.實際寫入(儲存)異動前,再取一次該變數的編號,若編號沒變則隨即把編號 1後寫入(儲存),若有變動則以新取出的編號 1寫入(儲存),然後把現行異動編號改成新取出的編號. 這部份的處理主要關鍵在於若資料庫可作 lock 處理,會更完美,若沒有 lock,有時會碰到網路傳輸太慢所導致的問題,亦可再加入 try except end的控制來避免編號重覆的問題.
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
引言: 每個人都有每個人的解決,我的解決如下: . .曾經幫之前公司的客服部門寫一個客戶來電留言紀錄系統,其中有一項作業是紀錄來電客戶,問題描述,負責的客服人員哪位,回電沒有等等,這項作業開了一個table去紀錄,primary key我很異想天開的用年月日時分秒存成字串當成單號來記錄,資料庫是sql server,同時上線的client有七個之多,離職後偶爾有回去maintain一下系統,還沒有發生存檔時單號重複的問題. 之所以這麼做是因為有想到,每個人按下存檔的時間都不一樣,當然前提是每台電腦的系統時間都一樣,又若各台電腦的系統時間不一樣,要有兩台以上的電腦再存檔時會那麼祝係剛好同一個時間連秒都一樣,那可能可以去買張彩券或刮刮樂. |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 在資料庫有二個欄位,一個為自動累加(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 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 在BeforePost前在取下Select Max(ID)來取得, 這樣會不會好一點???不論是在之前或是在之後來 select max(id) 都會發生問題, 因為時間差的現導致同時取得相同的 max(id). 所以一般最佳 的解決方法是利用 table lock 的方法 (table 獨佔) 來進行 新增並取得該 identity 的資料. 不過在 MS SQL 中的 @@Identity 變數就是在處理這個 identity 欄位於新增資料時所產生的流水號..引言: 之前是在Insert之後下Select Max(ID)來取得, 但在多人環境之中,不保證在這兩個SQL不會被 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |