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

請教 ADOQuery 限制(刪除多餘)資料筆數的 SQL 語法問題

尚未結案
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-14 18:22:09 IP:61.221.xxx.xxx 未訂閱
請教一下 程式碼編寫方法 目前本人可以使用較笨的方法將Data內某些資料複製到其他地方, 再將原先資料庫清除後,然後將原先複製到其他地方的資料copy 回來 請教各位先進,是否有較輕鬆的程式語法 一段 就可以解決了?    原來語法: //--------------------------------------------------------------
        ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add(
    "Select Top 100 * into newTable from Work_Data order by Work_Data.Index  Desc");         //刪除
    ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add( "Delete * from Work_Data ");        //複製
    ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add( "Select * into Work_Data from newTable");         //刪除
    ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add( "Delete * from newTable");    
謝謝各位的協助. 練習! 練習! 再練習!
------
嘿嘿嘿
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-14 18:40:31 IP:61.62.xxx.xxx 未訂閱
ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add("set ROWCOUNT 100;"); ADOQuery_WorkData->SQL->Add("Delete from Work_Data order by Work_Data.Index asc;"); ADOQuery_WorkData->SQL->Add("set ROWCOUNT 0;");
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-15 16:01:41 IP:61.221.xxx.xxx 未訂閱
抱歉 !!    測試結果 BCB 好像只認定固定單字的開頭     
    //這行不能執行,會有錯誤出現
    ADOQuery_WorkData->SQL->Add("set ROWCOUNT 100;");     
有點頭痛.... 練習! 練習! 再練習!
------
嘿嘿嘿
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-15 16:05:39 IP:61.222.xxx.xxx 未訂閱
可以把您的程式碼貼上來看看,理論上 "" 裡面都是字串呀?
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-15 16:21:37 IP:61.221.xxx.xxx 未訂閱
     
 
    ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add("set ROWCOUNT 10 ;");
    ADOQuery_WorkData->SQL->Add("Delete from Work_Data order by Work_Data.Index asc;");
    ADOQuery_WorkData->SQL->Add("set ROWCOUNT 0 ;");        ADOQuery_WorkData->Active = false ;
    ADOQuery_WorkData->Active = true ;    
異常訊息為" 無效的SQL陳述式,預期為'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE' " 練習! 練習! 再練習!
------
嘿嘿嘿
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-15 16:25:10 IP:61.222.xxx.xxx 未訂閱
    ADOQuery_WorkData->SQL->Clear() ;
    ADOQuery_WorkData->SQL->Add("set ROWCOUNT 10 ;");
    ADOQuery_WorkData->SQL->Add("Delete from Work_Data order by Work_Data.Index asc;");
    ADOQuery_WorkData->SQL->Add("set ROWCOUNT 0 ;");        ADOQuery_WorkData->Active = false ;
    ADOQuery_WorkData->Active = true ;
    ADOQuery_WorkData->ExecSQL();
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-15 16:42:27 IP:61.221.xxx.xxx 未訂閱
非常抱歉.    仍然有錯誤訊息,難道是 BCB 元件本身限制的問題??    異常訊息仍然是 " 無效的SQL陳述式,預期為'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE' " 練習! 練習! 再練習!
------
嘿嘿嘿
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-15 17:08:10 IP:61.222.xxx.xxx 未訂閱
這是我自己測試的程式,粗體字部分就是您要留下來多少筆資料:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select count(*) as cnt from Work_Data");
    ADOQuery1->Open();
    int cnt = ADOQuery1->FieldByName("cnt")->AsInteger;        ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("set ROWCOUNT "   IntToStr(cnt - 100));
    ADOQuery1->SQL->Add("delete from Work_Data");
    ADOQuery1->SQL->Add("set ROWCOUNT 0");
    ADOQuery1->ExecSQL();
}
P.S 不好意思我疏忽了,Delete from 沒有 Order by 可以用。
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-15 17:32:53 IP:61.221.xxx.xxx 未訂閱
非常抱歉.        異常訊息仍然是  "無效的SQL陳述式,預期為'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE' " 應該還是以下語法無法執行
ADOQuery1->SQL->Add("set ROWCOUNT "   IntToStr(cnt - 100));
我是用 bcb6 Proessional 版本 連開個新專案測試也是一樣的結果,可能只好乖乖的 Copy , Del 了 ... /_ 練習! 練習! 再練習!
------
嘿嘿嘿
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-15 17:46:17 IP:61.221.xxx.xxx 未訂閱
一個小小的發現!! 好像是本人使用的 Access 檔案的問題 Access 的 Sql 語法好像不容許 特定字以外的單字出現 所以目前一直無法執行設定動作 ... /_ 練習! 練習! 再練習!
------
嘿嘿嘿
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-15 21:59:37 IP:61.62.xxx.xxx 未訂閱
我後來覺得這樣下比較好,可是 Access 不知道有沒有支援 Top 的語法?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select count(*) as cnt from Work_Data");
    ADOQuery1->Open();
    int cnt = ADOQuery1->FieldByName("cnt")->AsInteger - 100;
    cnt = cnt >= 0 ? cnt : 0;        ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("delete from Work_Data");
    ADOQuery1->SQL->Add(" where Work_Data.Index <= ");
    ADOQuery1->SQL->Add(" (");
    ADOQuery1->SQL->Add(" select Top "   IntToStr(cnt));
    ADOQuery1->SQL->Add(" max(Work_Data.Index) as MaxIdx");
    ADOQuery1->SQL->Add(" from Work_Data");
    ADOQuery1->SQL->Add(" group by Work_Data.Index");
    ADOQuery1->SQL->Add(" order by Work_Data.Index asc");
    ADOQuery1->SQL->Add(" )");        ADOQuery1->ExecSQL();
}
發表人 - allenchan 於 2004/12/15 22:54:39
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-16 08:46:21 IP:61.221.xxx.xxx 未訂閱
感謝您的協助 昨晚找到以前上課過的SQL 書籍,重新ReView 終於被我測試出來可應付 Access 檔案要求的語法    如下     
    //目標:保留最後(新) ? 筆資料
    ADOQuery_WorkData->SQL->Clear() ;        ADOQuery_WorkData->SQL->Add( "Delete  from Work_Data ");
    ADOQuery_WorkData->SQL->Add( "where Work_Data.Index not in ( Select Top 10 Work_Data.Index from Work_Data order by Work_Data.Index  Desc );");
    ADOQuery_WorkData->ExecSQL();     
供各位參考,謝謝 練習! 練習! 再練習!
------
嘿嘿嘿
系統時間:2024-05-19 7:12:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!