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

ADOQuery->Post問題

答題得分者是:ko
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-08-09 12:58:19 IP:220.229.xxx.xxx 訂閱
請教各位先進,
ADOQuery用sql語法Select某一欄位,然後再對ADOQuery用Edit、Post修改,這樣是錯的嗎?
因為我只要改到單一欄位,想說不用Select *,但是沒用Select * 確實會出錯。
例子如下:

[code cpp]
ADOT->Active=false;
ADOT->TableName="ANo";
ADOT->Active=true;

ADOQ1->Close();
ADOQ1->SQL->Clear();
ADOQ1->SQL->Add("select ANo from AREA");
//ADOQ1->SQL->Add("select * from AREA");
ADOQ1->Open();
ADOQ1->First();
ADOT->First();
while(!ADOT->Eof)
{
ADOQ1->Edit();
ADOQ1->FieldByName("ANo")->Value=ADOT->FieldByName("ANo")->Value;
ADOQ1->Post();

ADOQ1->Next();
ADOT->Next();
}

[/code]

編輯記錄
ttnnrsseb 重新編輯於 2010-08-09 12:59:25, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-08-12 09:36:13 IP:202.39.xxx.xxx 訂閱
建議在 IDE 執行 DataBase->SQL Monitor,
Run 該 Project 時您便會看到 Post() 送至 Server 的 SQL 指令,
也就知道為何會 Error 了!
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-08-12 13:12:02 IP:220.229.xxx.xxx 訂閱
感謝先進的回覆,SQL Monitor只限BDE,我是使用ADO的方式。
我寫了一個BDE的程式來測試,結果竟然不會有錯誤。
資料表中不只一個欄位。
SQL Monitor也沒秀什麼訊息。

[code cpp]
Query1->RequestLive=true;
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add(select ANo from AREA.db);
Query1->Open();

Query1->Edit();
Query1->FieldByName("ANo")->AsString = "test123";
Query1->Post();
[/code]
編輯記錄
ttnnrsseb 重新編輯於 2010-08-12 14:52:06, 註解 無‧
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-08-12 14:00:42 IP:59.120.xxx.xxx 未訂閱
雖然我不懂C++Builder...
但我還是想要請問
照您的語法來看
ANo應該是個資料表吧
那ADOT->TableName="ANo";
這個不是應該要指向資料表嗎???
怎麼您好像是指向欄位去了?
還是您的ADOT中的ANo也是個資料庫@@?

我只是好奇問一問....>"<


===================引 用 ttnnrsseb 文 章===================
請教各位先進,
ADOQuery用sql語法Select某一欄位,然後再對ADOQuery用Edit、Post修改,這樣是錯的嗎?
因為我只要改到單一欄位,想說不用Select *,但是沒用Select * 確實會出錯。
例子如下:

[code cpp]
ADOT->Active=false;
ADOT->TableName="ANo";
ADOT->Active=true;

ADOQ1->Close();
ADOQ1->SQL->Clear();
ADOQ1->SQL->Add("selectANo from AREA");
//ADOQ1->SQL->Add("select* from AREA");
ADOQ1->Open();
ADOQ1->First();
ADOT->First();
while(!ADOT->Eof)
{
ADOQ1->Edit();
ADOQ1->FieldByName("ANo")->Value=ADOT->FieldByName("ANo")->Value;
ADOQ1->Post();

ADOQ1->Next();
ADOT->Next();
}

[/code]

ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-08-12 14:48:39 IP:220.229.xxx.xxx 訂閱
hi 老大仔,
AREA是資料表,ANo是其中的一個欄位。
所以SQL的語法我是寫select ANo(欄位) from AREA(資料表)

===================引 用 老大仔 文 章===================
雖然我不懂C Builder...
但我還是想要請問
照您的語法來看
ANo應該是個資料表吧
那ADOT->TableName="ANo";
這個不是應該要指向資料表嗎???
怎麼您好像是指向欄位去了?
還是您的ADOT中的ANo也是個資料庫@@?

我只是好奇問一問....>"<


===================引 用 ttnnrsseb 文 章===================
請教各位先進,
ADOQuery用sql語法Select某一欄位,然後再對ADOQuery用Edit、Post修改,這樣是錯的嗎?
因為我只要改到單一欄位,想說不用Select *,但是沒用Select * 確實會出錯。
例子如下:

[code cpp]
ADOT->Active=false;
ADOT->TableName="ANo";
ADOT->Active=true;

ADOQ1->Close();
ADOQ1->SQL->Clear();
ADOQ1->SQL->Add("selectANo from AREA");
//ADOQ1->SQL->Add("select* from AREA");
ADOQ1->Open();
ADOQ1->First();
ADOT->First();
while(!ADOT->Eof)
{
ADOQ1->Edit();
ADOQ1->FieldByName("ANo")->Value=ADOT->FieldByName("ANo")->Value;
ADOQ1->Post();

ADOQ1->Next();
ADOT->Next();
}

[/code]

老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-08-12 14:56:20 IP:59.120.xxx.xxx 未訂閱
既然AREA是資料表
那為什麼您的:ADOT->TableName="ANo";
卻是指向欄位呢??

===================引 用 ttnnrsseb 文 章===================
hi 老大仔,
AREA是資料表,ANo是其中的一個欄位。
所以SQL的語法我是寫select ANo(欄位) from AREA(資料表)


編輯記錄
老大仔 重新編輯於 2010-08-12 14:56:38, 註解 無‧
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-08-12 16:22:46 IP:220.229.xxx.xxx 訂閱
sorry,這個是貼文的時候不小心改錯了。
感謝你的指正,
更正如下:

[code cpp]
ADOT->Active=false;
ADOT->TableName="
AREA";
ADOT->Active=true;


ADOQ1->Close();
ADOQ1->SQL->Clear();
ADOQ1->SQL->Add("selectANo from AREA");
//ADOQ1->SQL->Add("select* from AREA");
ADOQ1->Open();



ADOQ1->First();
ADOT->First();
while(!ADOT->Eof)
{
ADOQ1->Edit();
ADOQ1->FieldByName("ANo")->Value=ADOT->FieldByName("ANo")->Value;
ADOQ1->Post();

ADOQ1->Next();
ADOT->Next();
}

[/code]

編輯記錄
ttnnrsseb 重新編輯於 2010-08-12 16:23:11, 註解 無‧
ttnnrsseb 重新編輯於 2010-08-12 16:24:03, 註解 無‧
ttnnrsseb 重新編輯於 2010-08-12 16:24:56, 註解 無‧
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-08-13 14:22:46 IP:210.242.xxx.xxx 未訂閱
可以說明一下是什麼錯誤訊息嗎?
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-08-16 10:43:09 IP:220.229.xxx.xxx 訂閱
版主您好,
我的ADO是使用Access當資料庫,
錯誤訊息是索引鍵資料行資訊不足或不正確

之前有個討論也是這個錯誤訊息,
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=28708
但他是因為select三個欄位,卻更新了十個欄位。

我select一個欄位,也只更新那一個欄位。
現在我用select *是可以避免問題發生,只是想請教先進們是不是有觀念上的不對。
謝謝~
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-08-16 14:40:49 IP:60.248.xxx.xxx 訂閱
SELECT * 是必要的,不然SQL無法正確使用資料結構來做異動
因此只搜尋一個欄位是會被DB 鎖住無法異動
------
======================
昏睡~
不昏睡~
不由昏睡~
系統時間:2017-12-13 21:07:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!