全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1690
推到 Plurk!
推到 Facebook!

將主索引內的數值,重新排序所造成錯誤

答題得分者是:GrandRURU
xfox
一般會員


發表:5
回覆:14
積分:8
註冊:2003-04-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-24 13:48:06 IP:211.74.xxx.xxx 訂閱
請問一下主索引問題
若資料1~10,我需要在其中的第五筆資料新增一筆資料,並將主索引內的數值重新排序,但排序後會發生"table is read only"錯誤以下為程式內容


int no=UserProgramQuery->FieldByName("CutNO")->AsFloat 1; //取得插入的ID位置
UserProgramQuery->Insert(); //插入一筆新資料

UserProgramQuery->First();
for(int i=1;i<=UserProgramQuery->RecordCount 1;i ){
int aa = UserProgramQuery->FieldByName("X")->AsFloat;
if(i == no){continue;} //先將插入的ID預留
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("CutNO")->AsFloat =i; //重新排序
UserProgramQuery->Post();
UserProgramQuery->Next();
}
UserProgramQuery->FieldByName("CutNO")->AsFloat = no
UserProgramQuery->ApplyUpdates(); //程式錯誤
編輯記錄
xfox 重新編輯於 2009-09-24 13:49:10, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-09-24 17:22:24 IP:203.75.xxx.xxx 未訂閱
應該是這樣,請再試試
[code cpp]
int no=UserProgramQuery->FieldByName("CutNO")->AsFloat 1; //取得插入的ID位置
UserProgramQuery->Insert(); //插入一筆新資料

UserProgramQuery->First();
for(int i=1;i<=UserProgramQuery->RecordCount 1;i )
{
int aa = UserProgramQuery->FieldByName("X")->AsFloat;
if(i == no){continue;} //先將插入的ID預留
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("CutNO")->AsFloat =i; //重新排序
UserProgramQuery->Post();
UserProgramQuery->Next();
}
//缺這行
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("CutNO")->AsFloat = no;
//還有這行
UserProgramQuery->Post();
UserProgramQuery->ApplyUpdates(); //程式錯誤
[/code]
===================引 用 xfox 文 章===================
請問一下主索引問題
若資料1~10,我需要在其中的第五筆資料新增一筆資料,並將主索引內的數值重新排序,但排序後會發生"table is read only"錯誤以下為程式內容


int no=UserProgramQuery->FieldByName("CutNO")->AsFloat 1; //取得插入的ID位置
UserProgramQuery->Insert(); //插入一筆新資料

UserProgramQuery->First();
for(int i=1;i<=UserProgramQuery->RecordCount 1;i ){
int aa = UserProgramQuery->FieldByName("X")->AsFloat;
if(i == no){continue;} //先將插入的ID預留
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("CutNO")->AsFloat =i; //重新排序
UserProgramQuery->Post();
UserProgramQuery->Next();
}
UserProgramQuery->FieldByName("CutNO")->AsFloat = no
UserProgramQuery->ApplyUpdates(); //程式錯誤
xfox
一般會員


發表:5
回覆:14
積分:8
註冊:2003-04-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-09-24 18:25:37 IP:211.74.xxx.xxx 訂閱
修改後還是出現"update failed"
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-09-24 20:21:56 IP:118.167.xxx.xxx 未訂閱
 UserProgramQuery->ApplyUpdates();

如果沒有寫交易動作的話,其實這行是可以拿掉的。

還是說拿掉後資料寫不進去?

xfox
一般會員


發表:5
回覆:14
積分:8
註冊:2003-04-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-09-25 09:31:56 IP:211.74.xxx.xxx 訂閱
UserProgramQuery->ApplyUpdates();
拿掉後資料無法寫入至資料庫
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-09-25 11:13:28 IP:203.75.xxx.xxx 未訂閱
先重新對Table is read-only的問題做解答

參閱
delphi.ktop.com.tw/board.php 內的

「請將Query元件的RequestLive屬性值設為﹕True
利用SQL查詢語句回傳的資料為ReadOnly(唯讀狀態)﹐但其可以透過RequestLive屬性值為True將其改成讀寫狀態﹒」

====================
再來是
UserProgramQuery->ApplyUpdates(); //程式錯誤

在help範本中是這樣寫的

The following procedure illustrates how to apply a dataset cached updates to a database in response to a button click:
[code cpp]
void __fastcall TForm1::ApplyButtonClick(TObject *Sender)
{
Database1->StartTransaction();
try
{
CustomerQuery->ApplyUpdates(); // try to write the updates to the database
Database1->Commit(); // on success, commit the changes;
}
catch (...)
{
Database1->Rollback(); // on failure, undo the changes
throw; // throw the exception to prevent a call to CommitUpdates!
}
CustomerQuery->CommitUpdates(); // on success, clear the cache
}
[/code]


最後,我利用BDE DBDemos對employee.db做了以下處理,到post這段可正確執行
[code cpp]
int no=UserProgramQuery->FieldByName("EmpNO")->AsFloat 1; //取得插入的ID位置
UserProgramQuery->First();
for(int i=1;i<=UserProgramQuery->RecordCount 1;i )
{
if(i == no){continue;} //先將插入的ID預留
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("EmpNO")->AsFloat =i; //重新排序
UserProgramQuery->Post();
UserProgramQuery->Next();
}
UserProgramQuery->Edit();
UserProgramQuery->FieldByName("EmpNO")->AsFloat = no;
UserProgramQuery->Post();
[/code]


如果這樣還是沒辦法解決你的問題,請你再提供更完整的程式碼及環境內容,看有沒有高手可以來幫助你解決問題,以上。
xfox
一般會員


發表:5
回覆:14
積分:8
註冊:2003-04-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-09-26 08:40:43 IP:211.74.xxx.xxx 訂閱
我有抓出問題了,因UserProgramQuery->FieldByName("CutNO")->AsFloat,我將它設為主索引而我插入一筆資料後又重新將主索引內的數值重新編寫號碼,造成的資料庫下達UserProgramQuery->ApplyUpdates()時錯誤。

難道說主索引內的數值是不能被重新改寫的嗎?我是使用access去做資料庫聯結,跟資料庫有關嗎?
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-09-26 14:49:14 IP:118.167.xxx.xxx 未訂閱
key是可以修改的,但不能重複。

用的是ado元件嗎?

===================引 用 xfox 文 章===================
我有抓出問題了,因UserProgramQuery->FieldByName("CutNO")->AsFloat,我將它設為主索引而我插入一筆資料後又重新將主索引內的數值重新編寫號碼,造成的資料庫下達UserProgramQuery->ApplyUpdates()時錯誤。

難道說主索引內的數值是不能被重新改寫的嗎?我是使用access去做資料庫聯結,跟資料庫有關嗎?
xfox
一般會員


發表:5
回覆:14
積分:8
註冊:2003-04-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-09-28 15:12:42 IP:122.121.xxx.xxx 訂閱
我是用BDE元件,這有影響嗎
系統時間:2024-04-25 10:15:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!