線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1232
推到 Plurk!
推到 Facebook!

新增資料時, auto_increment欄位沒填值會出現錯誤

尚未結案
kcshu
一般會員


發表:1
回覆:2
積分:0
註冊:2003-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-02 22:01:24 IP:61.64.xxx.xxx 未訂閱
請問各位先進, 我用的資料庫為 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-02 22:20:09 IP:63.84.xxx.xxx 未訂閱
您好!    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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-02 22:49:03 IP:63.84.xxx.xxx 未訂閱
您好!    忘記考慮您所提及不允許使用者在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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-03 00:31:42 IP:61.62.xxx.xxx 未訂閱
類似的問題請參考: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-03 01:04:07 IP:61.64.xxx.xxx 未訂閱
引言: 類似的問題請參考: 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 來帶出, 讓新增資料時, 不會寫入該欄位即可", 請問這要怎麼做呢? 或是能給我一個範例呢? 謝謝
系統時間:2024-06-01 23:16:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!