Locate的疑問 |
尚未結案
|
Suzuna
一般會員 發表:25 回覆:57 積分:16 註冊:2004-05-11 發送簡訊給我 |
請問一下,我使用locate尋找輸入的資料,是否曾經在資料庫存在,常常會"失靈" 意思就是說,常常已經存在的資料,用locate尋找,會顯示false,
有時候又正常,請問這是為什麼呢 以下我的程式碼,Edit1是輸入的資料 TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;
if(Edit1->Text!=NULL)
{
if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text,Opts))
{
Application->MessageBoxA("此帳號已有人使用","注意",MB_OK);
}
else
{
Application->MessageBoxA("可以使用此帳號","注意",MB_OK);
F_Newinfo->Edit1->Text=Edit1->Text;
F_Conform_ACC->Hide();
}
}
else
{
Application->MessageBoxA("帳號不可空白,請重新輸入","注意",MB_OK);
}
| |
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: TLocateOptions Opts; Opts.Clear(); Opts << loCaseInsensitive;//不分大小寫 if(Edit1->Text!=NULL) { if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text,Opts)) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); } else { Application->MessageBoxA("可以使用此帳號","注意",MB_OK); F_Newinfo->Edit1->Text=Edit1->Text; F_Conform_ACC->Hide(); } } else { Application->MessageBoxA("帳號不可空白,請重新輸入","注意",MB_OK); }混心雜欲 棄修身~唉 發表人 - speedup 於 2004/07/06 13:54:34
------
唉~ |
|
Suzuna
一般會員 發表:25 回覆:57 積分:16 註冊:2004-05-11 發送簡訊給我 |
引言:謝謝你 不過還是會有此問題, 我大約簡述一下我的程式,就是一個按鈕負責上面的功能,在檢查帳號是否被使用過的時候,會跳出以上的MessageBox,若是正常,就會啟動新增帳號功能(確定會新增) 這時程式也不會關閉,可以繼續檢查帳號以及新增帳號 問題的比較常發生在,新增資料後,程式未關閉繼續檢查之時, 1.檢查a帳號,假設是012,確認資料庫無人使用,新增(我確定有新增進去) 2.程式不關閉,繼續檢查帳號,但此時再次檢查a帳號,居然會顯示,無人使用過, 於是可以再次新增此帳號 我知道sql可以設定不要重複,可是我希望程式這邊能判斷的到,所以想請問一下要怎麼寫?謝謝 還是說我上面有寫錯什麼地方呢?引言: TLocateOptions Opts; Opts.Clear(); Opts << loCaseInsensitive;//不分大小寫 if(Edit1->Text!=NULL) { if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text,Opts)) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); } else { Application->MessageBoxA("可以使用此帳號","注意",MB_OK); F_Newinfo->Edit1->Text=Edit1->Text; F_Conform_ACC->Hide(); } } else { Application->MessageBoxA("帳號不可空白,請重新輸入","注意",MB_OK); }混心雜欲 棄修身~唉 發表人 - speedup 於 2004/07/06 13:54:34 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
Suzuna 你好
不曉得ClientDataSet1的內容是怎麼來的,但可以嘗試在locate之前先將ClientDataSet Close後再Open才做Locate Form2->ClientDataSet1->Close(); Form2->ClientDataSet1->Open(); if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text,Opts)) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); ...... 說明: 1.第一次輸入帳號(假設102),檢查過關, 2.儲存102回資料庫 3.第二次輸入102 ,檢查! 還是找不到102的帳號,所以也過關(因此時ClientDataSet中並沒有102這個帳號) 4.改成這樣 關閉ClientDataSet,再開啟ClientDataset(重新從資庫取得資料) 輸入102 此時Locate 就可以找到了。 但是每次locate 前都要Close,Open,這對於程式效率有很大的影響,可以改成在第二步儲存新帳號時,同時新也在ClientDataset中相對的新增一筆,保持內容與資料庫同步,如此Locate時就不用關了又開。 小小意見提供參考! |
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
||
Suzuna
一般會員 發表:25 回覆:57 積分:16 註冊:2004-05-11 發送簡訊給我 |
||
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/ |
引言: 請問一下,我使用locate尋找輸入的資料,是否曾經在資料庫存在,常常會"失靈" 意思就是說,常常已經存在的資料,用locate尋找,會顯示false, 有時候又正常,請問這是為什麼呢 以下我的程式碼,Edit1是輸入的資料改這樣試試!!if(Edit1->Text!=NULL) { if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text, [loPartialKey, loCaseInsensitive])) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); } else { Application->MessageBoxA("可以使用此帳號","注意",MB_OK); F_Newinfo->Edit1->Text=Edit1->Text; F_Conform_ACC->Hide(); } } else { Application->MessageBoxA("帳號不可空白,請重新輸入","注意",MB_OK); }
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/ |
引言: hi,Suzuna: 請問您後端的資料庫是否為sql base的資料庫,也就是可以控制transaction的資料庫(如mssql,oracle..).依您所描述的內容,我在猜,第二次去locate時,常會失靈的原因,應該是第一次新增的帳號其實並沒有真的寫入到資料庫裡. 因為我沒有看到您新增帳號的程式,所以我不敢斷言您的資料其實還沒有被commit到資料庫裡.一個簡單的方法測試:當第一個帳號新增後,直接以資料庫的程式登入資料庫,然後下sql指令查詢一下你的程式所新增的帳號是否存在,就可以知道了.如果也是沒有找到,那應該可以肯定,您的delphi程式在新增帳號這個部分是有bug的 您參考看看您好,我確定有新增進去,因為每一次新增過後,未檢查下一次帳號之前,我都會進sql裡面看是否有存在,我確定有新增進去 至於我新增的程式碼如下 其中newok_blank為檢查資料是否空白 newok_pass為檢查密碼的function if(bool ok=newok_blank()) { if(bool ok1=newok_pass()) { Form2->ClientDataSet1->Insert(); Form2->ClientDataSet1->FieldByName("loginname")->AsString=Edit1->Text; Form2->ClientDataSet1->FieldByName("pwd")->AsString=Edit2->Text; Form2->ClientDataSet1->FieldByName("real_name")->AsString=Edit4->Text; Form2->ClientDataSet1->FieldByName("job_title")->AsString=Combo_Title->Text; Form2->ClientDataSet1->FieldByName("job_name")->AsString=Edit5->Text; Form2->ClientDataSet2->First(); while(!(Form2->ClientDataSet2->Eof)) { if((Form2->ClientDataSet1->FieldByName("job_title")->AsString)!= (Form2->ClientDataSet2->FieldByName("GROUP")->AsString)) { Form2->ClientDataSet2->Next(); } else { Application->MessageBoxA("!!!","!",MB_OK); Form2->ClientDataSet1->FieldByName("job_num")->AsInteger= Form2->ClientDataSet2->FieldByName("NUM")->AsInteger; } Form2->ClientDataSet2->Next(); } Form2->ClientDataSet1->Post(); Form2->ClientDataSet1->ApplyUpdates(0);
引言: hi,Suzuna: 請問您後端的資料庫是否為sql base的資料庫,也就是可以控制transaction的資料庫(如mssql,oracle..).依您所描述的內容,我在猜,第二次去locate時,常會失靈的原因,應該是第一次新增的帳號其實並沒有真的寫入到資料庫裡. 因為我沒有看到您新增帳號的程式,所以我不敢斷言您的資料其實還沒有被commit到資料庫裡.一個簡單的方法測試:當第一個帳號新增後,直接以資料庫的程式登入資料庫,然後下sql指令查詢一下你的程式所新增的帳號是否存在,就可以知道了.如果也是沒有找到,那應該可以肯定,您的delphi程式在新增帳號這個部分是有bug的 您參考看看另外,我的資料庫是使用MSSQL 謝謝你
引言:你好,我試過了,仍是會有錯誤產生引言: 請問一下,我使用locate尋找輸入的資料,是否曾經在資料庫存在,常常會"失靈" 意思就是說,常常已經存在的資料,用locate尋找,會顯示false, 有時候又正常,請問這是為什麼呢 以下我的程式碼,Edit1是輸入的資料改這樣試試!!if(Edit1->Text!=NULL) { if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text, [loPartialKey, loCaseInsensitive])) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); } else { Application->MessageBoxA("可以使用此帳號","注意",MB_OK); F_Newinfo->Edit1->Text=Edit1->Text; F_Conform_ACC->Hide(); } } else { Application->MessageBoxA("帳號不可空白,請重新輸入","注意",MB_OK); }
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
引言: Suzuna 你好您好,抱歉之前沒看到您的文章,我有使用過使用locate之前close再open 的方法,不過仍是沒有用 我程式中目前共有三個地方使用不曉得ClientDataSet1的內容是怎麼來的,但可以嘗試在locate之前先將ClientDataSet Close後再Open才做Locate Form2->ClientDataSet1->Close(); Form2->ClientDataSet1->Open(); if(Form2->ClientDataSet1->Locate("loginname",Edit1->Text,Opts)) { Application->MessageBoxA("此帳號已有人使用","注意",MB_OK); ...... 說明: 1.第一次輸入帳號(假設102),檢查過關, 2.儲存102回資料庫 3.第二次輸入102 ,檢查! 還是找不到102的帳號,所以也過關(因此時ClientDataSet中並沒有102這個帳號) 4.改成這樣 關閉ClientDataSet,再開啟ClientDataset(重新從資庫取得資料) 輸入102 此時Locate 就可以找到了。 但是每次locate 前都要Close,Open,這對於程式效率有很大的影響,可以改成在第二步儲存新帳號時,同時新也在ClientDataset中相對的新增一筆,保持內容與資料庫同步,如此Locate時就不用關了又開。 小小意見提供參考!
我看到現在還是一頭霧水,不了解為何這樣不行,那樣也不行?以下做個測試! 1.在Form1放個DataSource 設定DAtaSet屬性為ClientDataset1(就是你要locate的那個) 2.同樣再放個dbGrid 設定DataSource為剛加入的那個 3.再放個TButton 在OnCLick事件中寫入 Procedure TForm1.Button1Click(Sender: TObject); Begin ClientDataSet.Close; ClientDataSet.Open; End; 主要就是要將ClientDataSet導出來用目視檢視,看看到底是locate的動作是 真的找不到還是ClientDataSet中根本就不存在新增的資料 然後用你原來的操作,在新增之後除了檢視資料庫中是否已新 增進去之外,並同時用目視檢查該筆新增的記錄是否存在ClientDataset1中,接 著按一下剛新增的Button讓ClientdataSet先關再開,再檢視ClientDataset中是 否存在剛新增的記錄?
引言: Suzuna 你好您好,謝謝您教的測試方法,現在結果是,當我放上DBGrid後,按下新增,新增的那筆資料會出現在DBGrid的最上方,但是不知道是不是跟我的資料格式有關係,我的第一個欄位是由SQL自動新增的流水號(每新增一筆資料就 1),DBGrid每次在新增之後的那筆新資料,那個欄位都是空白 新增之後我進去SQL檢查過,確實有新增進去,但是按一下Button讓ClientDataSet關閉重新開啟之後,那筆剛剛新增的資料就消失了@@ 我想這可能就是原因所在了,不過為什麼會這樣子呢@@?我看到現在還是一頭霧水,不了解為何這樣不行,那樣也不行?以下做個測試! 1.在Form1放個DataSource 設定DAtaSet屬性為ClientDataset1(就是你要locate的那個) 2.同樣再放個dbGrid 設定DataSource為剛加入的那個 3.再放個TButton 在OnCLick事件中寫入 Procedure TForm1.Button1Click(Sender: TObject); Begin ClientDataSet.Close; ClientDataSet.Open; End; 主要就是要將ClientDataSet導出來用目視檢視,看看到底是locate的動作是 真的找不到還是ClientDataSet中根本就不存在新增的資料 然後用你原來的操作,在新增之後除了檢視資料庫中是否已新 增進去之外,並同時用目視檢查該筆新增的記錄是否存在ClientDataset1中,接 著按一下剛新增的Button讓ClientdataSet先關再開,再檢視ClientDataset中是 否存在剛新增的記錄?
引言: 我發現我把DataSetProvider的ResolveToDataSet屬性設定為true就可以解決此情形了,書中寫設定為true是已連結的資料集更新回資料,不過,為什麼要這樣子,ClientDataSet的資料才回一起更新呢? 謝謝 是因為我有使用ADODataSet的原因嗎?Suzuna 你好 如此看來除了DataSetPeovider.ResolveToDataSet為False,搭配AdoDataSet.CursorLocation=clUseClient;且AdoDataSet.CacheSize應該設的很大(大於該資料表的總筆數或是大於ClientDataSet的PacketRecords值),兩者造成資訊斷層的現象 1.第一次取得資料,因為CursorLocation=clUseClient;所以AdoDataSet在AppServer的電腦記憶體中存有暫存資料, 2.當CLientDataSet新增一筆資料後,透過DataSetProvider更新回去資料庫,因為ResolveToDataSet為False,沒透過AdoDataSet更新,所以資料庫更新了,但AdoDataSet還保有舊的資料。 3.ClientDataSet再次要求資料時,AdoDataSet將舊有暫存資料再送出來,所以CLientDataSet又看到未新增前的資料。 解決方法,除了將DataSetProvider.ResolveToDataSet設為True外,還可以調整AdoDataSet.CursorLocation及CacheSize兩個屬性,使三個屬性不要同時發生上述的狀況。
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |