ADO 查詢語法.......疑問 |
尚未結案
|
nachi
初階會員 發表:40 回覆:116 積分:31 註冊:2003-02-26 發送簡訊給我 |
這程式在另一個表單用都沒問題,但在登入表單卻無法查詢中文字,各項參數都比對過了,不知原因何在@@抓了一個晚上的bug試了各種寫法,還是搞不定,不知還有什麼地方可能會有bug...
現象:執行後表單自行關閉,也沒有登入失敗訊息 使用M$資料庫,格式:文字,為主索引不可重覆~
procedure TForm2.Button1Click(Sender: TObject); begin with datamodule3.ADOQuery4 do begin active:=true; close; sql.Clear; SQL.Add('select * from 管理員資料 where 姓名 like Lname'); Parameters.ParamByName('Lname').value:=edit1.text; Open; end; if (dbedit1.Text = edit1.Text ) and (dbedit2.Text = edit2.Text) then begin if dbedit3.Text ='c' then begin root := true; //一般管理權限 form1.sss(root, sroot); form2.Free; end else begin sroot := true; //超級管理員權限 form1.sss(root, sroot); form2.Free; end; end else begin showmsg('帳號或密碼錯誤,請重試!', mkerror); form2.close; end; end;發表人 - nachi 於 2003/05/15 23:10:57 |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
請參考 紅字 部分....
procedure TForm2.Button1Click(Sender: TObject); begin with datamodule3.ADOQuery4 do begin---------------------------------------------------------------------------------------- 另外說明一下你的 dbtext3 所對應的欄位比對行為, 原則上[超級管理員權限]應比[一般管理權限]來的大, 所以應該以比較是否為[超級管理員權限]來判斷比較好, 以免除外比對後, 都變成了[超級管理員權限]. 這是比較嚴謹的作法, 建議改為: ---------------------------------------------------------------------------------------- //將所有 [超級管理員權限] 的可能都寫出來, 其他的才是[一般管理權限], 這是比較正確的寫法 //當然, 若是只有 'c' 是一般管理, 其他的都是超級管理的話, 也最好寫為 //if (fieldbyname('permission_c').AsString <> 's') then //其實就會和原本相同. 僅提供參考. if (fieldbyname('permission_c').AsString ='s') or (fieldbyname('permission_c').AsString ='r') then sroot := true //超級管理員權限 else root := true; //一般管理權限 form1.sss(root, sroot); //因為都會執行, 所以提到 if else 外. form2.Free; //因為都會執行, 所以提到 if else 外.---------------------------------------------------------------------------------------- |
nachi
初階會員 發表:40 回覆:116 積分:31 註冊:2003-02-26 發送簡訊給我 |
如果我想把edit1.text直接寫在sql.add(......)裡,應該要怎麼寫?若是要寫入兩個元件的話,又該怎麼寫呢?(edit1.text、edit2.text) 程式已修改,但問題仍未解決@@
等明天再加油囉.......
with datamodule3.ADOQuery4 do begin //active := true;<==把此行拿掉,在datamodule裡直接打開也一樣error,所以應該和此行無關 close; sql.Clear; SQL.Add('select * from 管理員資料 where 姓名 like :Lname'); Parameters.ParamByName('Lname').value := edit1.text; Open; end; if (datamodule3.ADOQuery4.FieldByName('姓名').AsString = edit1.Text) and (datamodule3.ADOQuery4.FieldByName('密碼').asstring = edit2.Text) then begin if (datamodule3.ADOQuery4.FieldByName('身份').AsString = 'c') then //判斷權限c為多數,且不是"一般"就是"超級"權限,這樣的話,用c來做比對還有差嗎? root := true //一般管理權限 else sroot := true; //超級管理員權限 form1.sss(root, sroot); form2.Free; end else begin showmsg('帳號或密碼錯誤,請重試!', mkerror); form2.close; end; end;發表人 - nachi 於 2003/05/16 00:26:06 發表人 - nachi 於 2003/05/16 00:32:27 |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
一般我會把姓名跟密碼寫在同一段SQL語法中..
with datamodule3.ADOQuery4 do begin active:=true; close; sql.Clear; SQL.Add('select * from 管理員資料 where 姓名 like ' #39 '%' edit1.text '%' #39 ' AND 密碼=' #39 edit2.text #39); Open; end; if datamodule3.ADOQuery4.IsEmpty then begin SHOWMESSAGE('輸入資料錯誤!!!'); Edit1.SetFocus; exit; end else begin if (datamodule3.ADOQuery4.FieldByName('身份').AsString = 'c') then root := true //一般管理權限 else sroot := true; //超級管理員權限 form1.sss(root, sroot); form2.Free; end;TRY TRY SEE 引言: 如果我想把edit1.text直接寫在sql.add(......)裡,應該要怎麼寫?若是要寫入兩個元件的話,又該怎麼寫呢?(edit1.text、edit2.text) |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
with datamodule3.ADOQuery4 do begin close; sql.Clear; SQL.Add('select * from 管理員資料 where 姓名 = :Lname and 密碼 = :Lpass'); Parameters.ParamByName('Lname').value := edit1.text; Parameters.ParamByName('Lpass').value := edit2.text; Open; end; if not datamodule3.ADOQuery4.IsEmpty then // 找到符合的資料 begin if (datamodule3.ADOQuery4.FieldByName('身份').AsString = 's') then sroot := true //超級管理員權限 else root := true; //一般管理權限 form1.sss(root, sroot); form2.Free; end else begin showmsg('帳號或密碼錯誤,請重試!', mkerror); form2.close; end; end;1. 既然你之後都用 = 來做對比,在 sql 不需用 like 2. 判斷權限c為多數,且不是"一般"就是"超級"權限,這樣的話,用c來做比對還有差嗎? 若一切正常沒差但意外常會發生,比方說若寫數據到一半出錯沒寫入身份欄位,你希望這個使用者的權限是一般還是超級呢,按你的程式碼空白欄位因為不是 c 也是被判超級的。 3. 單看你現在的程式碼出錯的原因有以下可能 : a) datamodule3 在這段程式執行時沒被建立好 b) form1.sss(root,sroot) 沒能告知 Form1 已成功登入不要關閉,所以當登錄成功後 Form2 關閉連 Application 也關閉了,登入成功所以沒失敗訊息 請查看 1. 有否AccessViolation Error 或其他 Error 跳出來呢? 2. 用 Debugger 看看是執行到那行退出的 3. 用錯的名稱密碼有沒顯示登入失敗 我開始打時沒見 chih 兄的留言,一下就過了半小時< >,呵方法大家都是差不多 >< > 發表人 - |
nachi
初階會員 發表:40 回覆:116 積分:31 註冊:2003-02-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |