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

一個有關Query的問題

尚未結案
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-04 21:07:30 IP:61.70.xxx.xxx 未訂閱
我正再做一個藉由網路登錄的小程式 程式片段如下(server端的) AnsiString buf,buf1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ServerSocket1->Active=true; ServerSocket2->Active=true; ServerSocket3->Active=true; AnsiString buf2; Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->Open(); if(Query1->RecordCount!=0) { buf2 = 1; ServerSocket3->Socket->Connections[0]->SendText(buf2); Label1->Caption="此為註冊會員"; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { buf = ServerSocket1->Socket->ReceiveText(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket2ClientRead(TObject *Sender, TCustomWinSocket *Socket) { buf1 = ServerSocket2->Socket->ReceiveText(); } buf為Client傳過來的ID buf1為Client傳過來的Password 出現一個錯誤視窗說 (ProjectProject1.exe raised exception class EDatabaseError with message 'Query1:Field 'buf' is of an unknown type........) P.S.上述程式如有錯誤能提醒小弟......感謝各位大大
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-05 09:37:01 IP:211.20.xxx.xxx 未訂閱
Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->Open(); 在這一段中似乎沒有看到你把buf和buf1帶進去 你加上CreateParameter試試看 用法可以參考以下網頁 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53884
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-05 21:19:37 IP:61.70.xxx.xxx 未訂閱
引言: Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->Open(); 在這一段中似乎沒有看到你把buf和buf1帶進去 你加上CreateParameter試試看 用法可以參考以下網頁 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53884
我將buf和buf1設為全域的變數
bennychen
一般會員


發表:0
回覆:7
積分:1
註冊:2003-03-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-06 00:05:29 IP:218.167.xxx.xxx 未訂閱
這與全域變數好像無關, 因為Query並不知道裡面的動態參數與您的全域變數有什麼關係, 所以, 建議將程式修改如下: //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ServerSocket1->Active=true; ServerSocket2->Active=true; ServerSocket3->Active=true; AnsiString buf2; Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->ParamByName("buf")->AsString = buf; //<---加入的程式碼 Query1->ParamByName("buf1")->AsString = buf1; //<---加入的程式碼 Query1->Open(); if(Query1->RecordCount!=0) { buf2 = 1; ServerSocket3->Socket->Connections[0]->SendText(buf2); Label1->Caption="此為註冊會員"; } } //--------------------------------------------------------------------------- 應該就可以了吧!
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-06 08:11:54 IP:61.70.xxx.xxx 未訂閱
引言: 這與全域變數好像無關, 因為Query並不知道裡面的動態參數與您的全域變數有什麼關係, 所以, 建議將程式修改如下: //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ServerSocket1->Active=true; ServerSocket2->Active=true; ServerSocket3->Active=true; AnsiString buf2; Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->ParamByName("buf")->AsString = buf; //<---加入的程式碼 Query1->ParamByName("buf1")->AsString = buf1; //<---加入的程式碼 Query1->Open(); if(Query1->RecordCount!=0) { buf2 = 1; ServerSocket3->Socket->Connections[0]->SendText(buf2); Label1->Caption="此為註冊會員"; } } //--------------------------------------------------------------------------- 應該就可以了吧!
我現在改用ADOQuery應該可以用吧 出現下面的錯誤: 'ParamByName' is not a member of 'TStrings
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-06 08:20:37 IP:211.20.xxx.xxx 未訂閱
SQL是一種程式語言 BCB也是一種程式語言 只是SQL是叫DataBase去做事 BCB是叫你的PC去做事 但是SQL看不到BCB的變數的 因為BCB只會傳SQL字串進去 你要傳變數給SQL就要用Parameter的方式傳給它 研究一下 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53884 對你會有幫助的 了解為什麼,遠比做出成果卻不知為什麼做的出來強多了 為什麼~為什麼~為什麼~~~
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-06 08:24:51 IP:61.70.xxx.xxx 未訂閱
引言: Query1->Close(); Query1->SQL->Add("Select * from User.mdb Where ID=:buf,Password=:buf1"); Query1->Open(); 在這一段中似乎沒有看到你把buf和buf1帶進去 你加上CreateParameter試試看 用法可以參考以下網頁 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53884
先謝謝folkchen大大 大大的方法沒錯 可是出現了一個錯誤視窗 (提供不一致或不完全的資訊導致參數物件不適當地被拒) 這是什麼原因ㄚ
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-06 08:36:31 IP:211.20.xxx.xxx 未訂閱
可否列出你改寫後的程式 以及你用的是那種DB 還有你是否有測過SQL先寫死不帶入,是否可以正常RUN 用以判斷是SQL寫法不對還是BCB帶入的方式不對 記得在Accress中"ID"是保留字不知其他DB有無這個問題
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-06 08:58:03 IP:61.70.xxx.xxx 未訂閱
引言: 可否列出你改寫後的程式 以及你用的是那種DB 還有你是否有測過SQL先寫死不帶入,是否可以正常RUN 用以判斷是SQL寫法不對還是BCB帶入的方式不對 記得在Accress中"ID"是保留字不知其他DB有無這個問題
//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; AnsiString buf,buf1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { buf = Socket->ReceiveText(); Edit1->Text=buf; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket2ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString test; buf1 = Socket->ReceiveText(); Edit2->Text=buf1; ADOQuery1->Close(); ADOQuery1->Parameters->CreateParameter("CheckID",ftString,pdInput,30,buf); ADOQuery1->Parameters->CreateParameter("CheckPassword",ftString,pdInput,30,buf1); ADOQuery1->SQL->Add("Select * from C:\Program Files\Borland\CBuilder6\Projects\s\User.mdb Where ID=:CheckID,Password=:CheckPassword"); ADOQuery1->Open(); if(ADOQuery1->RecordCount!=0) { test="1111"; ServerSocket3->Socket->Connections[0]->SendText(test); } } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket3ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Label3->Caption="成功"; } //--------------------------------------------------------------------------- 我也有試過寫死 但還是出現之前的問題
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-06 09:10:30 IP:211.20.xxx.xxx 未訂閱
SQL字串寫死不帶入變數還是有問題 那表示問題不在帶入變數的地方 而是在Query要連到DB或是SQL本身有問題    >>ADOQuery1->SQL->Add("Select * from C:\Program Files\Borland\CBuilder6\Projects\s\User.mdb Where ID=:CheckID,Password=:CheckPassword"); 路徑字串不能只用單斜線,你將\改成\\試試 >>記得在Accress中"ID"是保留字不知其他DB有無這個問題 在Accress中若欄位宣告為ID,在SQL中要用到ID欄位就要寫成[ID]
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-09 11:00:19 IP:211.162.xxx.xxx 未訂閱
不好意思,小弟插個花: buf和buf1雖然是總體變數,但是在下句中: Select * from User.mdb Where ID=:buf,Password=:buf1 中,SQL語句並不知道如何變數buf,buf1所代表的值(也就是不知明的類型),需要我們給它指明,這也就是爲何會出現下面的錯誤: ProjectProject1.exe raised exception class EDatabaseError with message 'Query1:Field 'buf' is of an unknown type........ 當改用ADOQuery出現下面的錯誤: 'ParamByName' is not a member of 'TStrings 是因爲Query和ADOQuery的用法不一樣,不能直接將 Query1->ParamByName("buf")->AsString = buf轉成 ADOQuery1->ParamByName("buf")->AsString = buf,換成 ADOQuery1->Parameters->ParamByName("buf")->Value = buf就可以了。 非常贊成folkchen大大的話,在BCB中變數引用"\\"會被簡化成"\",如果是直接用"\"的話,就會出現連在一起的現象。 請留意一下這句Select * from C:\Program Files\Borland\CBuilder6\Projects\s\User.mdb,小弟個人認爲,雖然指出了User.mdb的位置,但是沒有指明需要進行操作的是那個Table,BCB也就無法找到,必然抛出異常。我們不妨利用ADO元件的ConnectionString來指明User.mdb的位置,不必直接將資料庫名帶入,我們需要帶入的是Table名 小弟鬥膽修改了您的code,還請您不妨看看(假設您的User.mdb中用來存放用戶名和密碼的Table爲Table1,而且欄位id和password的類型都爲char):

......
AnsiString buf,buf1;
......
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        AnsiString buf2;            ServerSocket1->Active=true;
        ServerSocket2->Active=true;
        ServerSocket3->Active=true;
        
        ADOQuery1->Close();
        ADOQuery1->SQL->Clear();
        ADOQuery1->SQL->Add("select * from Table1 where User_ID =:buf and User_Data =:buf1");
        ADOQuery1->Parameters->ParamByName("buf")->Value  = buf;
        ADOQuery1->Parameters->ParamByName("buf1")->Value = buf1;
        ADOQuery1->Open();            if(ADOQuery1->RecordCount != 0)
        {
            buf2 = 1;
            ServerSocket3->Socket->Connections[0]->SendText(buf2);
            Label1->Caption="此為註冊會員";
        }
}
如有謬誤,還請各位先進指出,小弟將心存感激,謝謝! ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-13 21:49:22 IP:61.70.xxx.xxx 未訂閱
各位好心的大大感謝解答 剛剛又重新試了一次 用了ADOConnection ADOQuery DataSouce和DBGrid 作了兩次測試 ------一次是SQL語法寫死------ SQL語法 有一個地方我覺得怪怪的 就是在SQL語法中的From 我之前是寫User.mdb後來我改成裡面表格的 名稱"資料表1"就可以顯示在DBGrid上了 而之前寫的User.mdb就出現了之前的問題 是哪裡出了問題ㄚ......不解 另一是SQL語法沒有寫死的<-----------還是同樣的問題.........= =
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-13 22:25:27 IP:61.70.xxx.xxx 未訂閱
感謝各位大大的解答  我的問題已經解答出來了 以下是我改完後的程式   如還有錯誤請大大指點一下    //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; AnsiString buf,buf1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString test; buf = Socket->ReceiveText(); Edit1->Text=buf; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket2ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString test; buf1 = Socket->ReceiveText(); Edit2->Text=buf1; ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,buf); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,buf1); ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID and Password=:checkPassword"); ADOQuery1->Open(); if(ADOQuery1->RecordCount!=0) { test="1111"; ServerSocket3->Socket->Connections[0]->SendText(test); Label3->Caption=ADOQuery1->RecordCount; } } //---------------------------------------------------------------------------
系統時間:2024-05-04 23:09:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!