一個有關Query的問題 |
尚未結案
|
a126154362
一般會員 發表:21 回覆:13 積分:6 註冊:2004-05-30 發送簡訊給我 |
我正再做一個藉由網路登錄的小程式 程式片段如下(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 發送簡訊給我 |
|
a126154362
一般會員 發表:21 回覆:13 積分:6 註冊:2004-05-30 發送簡訊給我 |
|
bennychen
一般會員 發表:0 回覆:7 積分:1 註冊:2003-03-17 發送簡訊給我 |
這與全域變數好像無關, 因為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 發送簡訊給我 |
引言: 這與全域變數好像無關, 因為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 發送簡訊給我 |
|
a126154362
一般會員 發表:21 回覆:13 積分:6 註冊:2004-05-30 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
a126154362
一般會員 發表:21 回覆:13 積分:6 註冊:2004-05-30 發送簡訊給我 |
引言: 可否列出你改寫後的程式 以及你用的是那種DB 還有你是否有測過SQL先寫死不帶入,是否可以正常RUN 用以判斷是SQL寫法不對還是BCB帶入的方式不對 記得在Accress中"ID"是保留字不知其他DB有無這個問題//--------------------------------------------------------------------------- #include |
folkchen
高階會員 發表:9 回覆:232 積分:173 註冊:2003-10-09 發送簡訊給我 |
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 發送簡訊給我 |
不好意思,小弟插個花:
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 發送簡訊給我 |
各位好心的大大感謝解答 剛剛又重新試了一次 用了ADOConnection ADOQuery DataSouce和DBGrid
作了兩次測試 ------一次是SQL語法寫死------
SQL語法 有一個地方我覺得怪怪的
就是在SQL語法中的From 我之前是寫User.mdb後來我改成裡面表格的
名稱"資料表1"就可以顯示在DBGrid上了
而之前寫的User.mdb就出現了之前的問題
是哪裡出了問題ㄚ......不解 另一是SQL語法沒有寫死的<-----------還是同樣的問題.........= =
|
a126154362
一般會員 發表:21 回覆:13 積分:6 註冊:2004-05-30 發送簡訊給我 |
感謝各位大大的解答 我的問題已經解答出來了
以下是我改完後的程式 如還有錯誤請大大指點一下 //--------------------------------------------------------------------------- #include
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |