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

ADO 查詢語法.......疑問

尚未結案
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-15 22:57:28 IP:218.165.xxx.xxx 未訂閱
這程式在另一個表單用都沒問題,但在登入表單卻無法查詢中文字,各項參數都比對過了,不知原因何在@@抓了一個晚上的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-15 23:34:08 IP:210.3.xxx.xxx 未訂閱
Exception? remove this line: active:=true;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-15 23:52:43 IP:61.221.xxx.xxx 未訂閱
請參考 紅字 部分....
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;
//
// 這裡用 dbedit1.text 最好改為 dataset.fieldbyname('colname').AsString 比較理想, 
// 雖然是一樣的, 但是要取用 query 查回來的資料, 還是用該 query 的 dataset 來取比較正確.
//
//   if (dbedit1.Text  = edit1.Text ) and (dbedit2.Text = edit2.Text) then
   if (fieldbyname('user_name').AsString  = edit1.Text ) and (fieldbyname('password').AsString = edit2.Text) then
      begin
         if fieldbyname('permission_c').AsString ='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;
---------------------------------------------------------------------------------------- 另外說明一下你的 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-16 00:25:15 IP:218.165.xxx.xxx 未訂閱
如果我想把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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-16 07:24:40 IP:61.155.xxx.xxx 未訂閱
with datamodule3.ADOQuery4 do          begin //active:=true; close; sql.Clear; SQL.Add('select * from 管理員資料 where 姓名 like ''%' trim(edit1.text) '%'''); //Parameters.ParamByName('Lname').value:=edit1.text; Open; end; 供参考!!! 风花雪月 e梦情缘
------
风花雪月 e梦情缘
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-16 08:07:11 IP:211.74.xxx.xxx 未訂閱
一般我會把姓名跟密碼寫在同一段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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-16 08:32:05 IP:218.16.xxx.xxx 未訂閱
  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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-16 11:24:04 IP:218.165.xxx.xxx 未訂閱
問題解決囉^o^ 謝謝各位先進指教~ 不但學到寫法,還學到許多觀念問題^^
系統時間:2024-06-27 5:28:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!