新增資料時, auto_increment欄位沒填值會出現錯誤 |
尚未結案
|
kcshu
一般會員 發表:1 回覆:2 積分:0 註冊:2003-10-02 發送簡訊給我 |
請問各位先進,
我用的資料庫為 MySQL 版本 3.23.49
程式用Delhpi 7撰寫
作業系統為 WinXP 我有一個table的格式如下: CREATE TABLE class (
ID tinyint(3) unsigned NOT NULL auto_increment,
Name varchar(50) NOT NULL default '',
PRIMARY KEY (ID)
) TYPE=MyISAM; 我用SimpleDataSet DataSource DBGrid DBNavigator
寫了一個很簡單的程式, 所有的值都是預設:
當我執行他後, 按下DBNavigator上的新增按鈕後..
就可以在DBGrid中新增一筆資料..
但我想因為ID這個欄位是auto_increment, 所以我就只填Name這個欄位的值.
當我按下DBNavigator上的確定(打勾)時, 出現以下錯誤:
Project1.exe raised exception class EDatabaseError with message 'Field 'ID' must have a value'.Process stopped.
當然, 如果我有填值時就不會有錯, 但這欄位本來就是當作識別用,
所以根本就不希望使用者需要輸入他,
請問這問題該如何解決呢?
謝謝.
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! ID這個欄位是屬于鍵值欄位, 所以就不會有相同的值出現, 您可以再加入一個資料集元件用作查詢, 再利用程式碼控制其值在資料集元件的AfterInsert的時候, 查詢出目前最大的編號, 再設定新的資料錄ID欄位值為最大編號+1, 諸如以下程式碼:
在ADOQuery1的AfterInsert事件中:
begin ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add('Select Max(ID) As MaxID From Table'); ADOQuery2.Open; ADOQuery1.FieldByName('ID').AsInteger := ADOQuery2.FieldByName('MaxID').AsInteger 1; end;參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 忘記考慮您所提及不允許使用者在ID欄位做輸入或更改的動作, 您可在對應ADOQuery1元件的DataSource元件的OnStateChange中判斷, 如果資料集元件處于新增或修改狀態時, 當DBGrid中的焦點處于ID欄位時, 自動跳至下一個欄位, 程式碼如下:
DataSource1元件的OnStateChange事件:
begin if ADOQuery1.State in [dsInsert, dsEdit] then begin if DBGrid1.SelectedField.FieldName = 'ID' then begin DBGrid1.SelectedIndex := DBGrid1.SelectedIndex 1; end; end; end;參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
類似的問題請參考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30535 發生的原因是因為該欄位為 auto_increment, 所以不能給值, 但是使用資料感知元件新增資料時, 並不會知道使用者填入的狀況, 使用者不填, 該欄位就會用空白代入 insert 的指令中, 所以會造成使用資料感知元件新增資料時, 填值也不對(會引起auto_increment欄位不可填值), 不填值也不對(資料感知元件會帶空值進入 db), 最好的方法如上面的文章, 使用 TUpdateSQL 元件來自行修改 insert 的 sql command. 但 SimpleDataSet 沒有這種功能, 所以最好能配合另一個可以下達 sql command 的元件來進行資料的新增, 或是該欄位使用 alias 來帶出, 讓新增資料時, 不會寫入該欄位即可!
|
kcshu
一般會員 發表:1 回覆:2 積分:0 註冊:2003-10-02 發送簡訊給我 |
引言: 類似的問題請參考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30535 發生的原因是因為該欄位為 auto_increment, 所以不能給值, 但是使用資料感知元件新增資料時, 並不會知道使用者填入的狀況, 使用者不填, 該欄位就會用空白代入 insert 的指令中, 所以會造成使用資料感知元件新增資料時, 填值也不對(會引起auto_increment欄位不可填值), 不填值也不對(資料感知元件會帶空值進入 db), 最好的方法如上面的文章, 使用 TUpdateSQL 元件來自行修改 insert 的 sql command. 但 SimpleDataSet 沒有這種功能, 所以最好能配合另一個可以下達 sql command 的元件來進行資料的新增, 或是該欄位使用 alias 來帶出, 讓新增資料時, 不會寫入該欄位即可!請問一下,您提到"該欄位使用 alias 來帶出, 讓新增資料時, 不會寫入該欄位即可", 請問這要怎麼做呢? 或是能給我一個範例呢? 謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |