簡體   English   中英

C ++ Builder 6和Windows 7 64bit上的ADOQuery

[英]ADOQuery on C++ Builder 6 and Windows 7 64bit

我在使用TADOQuery組件時遇到了一個奇怪的問題。

我目前在一個他們使用Windows XP VM上運行的Borland C ++ Builder應用程序的地方工作。 因此,我們希望遷移到Windows 7並充當終端機,以便員工可以使用Windows 10接收新計算機,而無需在每台計算機上再次創建Win XP VM。

當前,該應用程序使用BDE組件,並且在XP上運行良好。 我們創建了一個Win7 64位VM進行測試,並安裝了必要的驅動程序等,但是BDE不能正常工作。 當我嘗試通過Borland附帶的SQL Explorer登錄時,它掛起了。 它發送請求,但從未得到響應。 我花了一個多星期的時間來嘗試調試此問題,但是卻一無所獲。

無論如何,我放棄了BDE並想嘗試更改為ADO。 因此,我首先簡單地創建一個TDBGrid並使用ADO組件將其填充數據。 它在XP和Win7上都很好用! 因此,現在我正在嘗試將應用程序的BDE組件( TDataBaseTQuery等)轉換為ADO組件。

嘗試使用參數時遇到一個有趣的問題。 這是一個查詢示例:

SELECT t1.SEC_CODE, t1.CODE, t1.CTRL_NUM, t1.CHECK_CODE,
t1.CHECK_NO, t1.CLIENT_ID, t1.AMOUNT, t1.TRANS_NO, decode(t2.prefix,null,t2.name,t2.name||', '||t2.prefix) as fullName,
t1.ENTRY_DATE, t1.DEPOSIT_DATE, t1.ACCT_COMMENT, t2.NAME, t2.PREFIX
FROM ACCOUNTING.ACCT_CHECK_IN t1, OISC.CLIENT t2
WHERE
(:BEN =1 OR (:BEN =0 AND t1.ENTRY_DATE=:DATE)
OR (:BEN =2 AND t1.DEPOSIT_DATE IS NOT NULL)
OR (:BEN =3 AND t1.DEPOSIT_DATE IS NULL)) AND
(:ALEX =1 OR (:ALEX =0 AND t1.ENTRY_DATE>=:DATE1 AND
t1.ENTRY_DATE<=:DATE2) OR (:ALEX =2 AND t1.DEPOSIT_DATE>=:DATE1
AND t1.DEPOSIT_DATE<=:DATE2))
AND T2.CLIENT_ID(+)=T1.CLIENT_ID 

ORDER BY t1.SEC_CODE, t1.CHECK_CODE, fullName, t1.check_no

請不要注意參數名稱,這對我來說有點有趣,但是你們將無法連接。

這里的第一個問題是,即使某些參數的名稱相同,ADO也會將它們視為單獨的參數! 因此,如果我這樣做:

checkload1->Parameters->ParamByName("BEN")->Value=0

ADO不會將每次出現的“ BEN”都替換為0,而最終得到的結果集為0記錄! 相反,我使用的是:

checkload1->Parameters->Items[0]->Value = 0; // BEN param
checkload1->Parameters->Items[1]->Value = 0;
checkload1->Parameters->Items[3]->Value = 0;
checkload1->Parameters->Items[4]->Value = 0;

基本上,根據參數索引將每個“ BEN”參數替換為0。

這給我帶來了結果,但不是馬上。

因此,它是這樣工作的:應用程序是基於樹的用戶界面。 有一個節點顯示“今天的支票”,展開后會顯示今天的支票。 太好了,現在對BDE來說效果很好,而且我只分配了一次參數值,並且它在看到“ BEN”的任何地方都會自動替換它,等等。

使用ADO組件時,我展開了“今天的檢查”節點,但是代碼運行了,加載了參數,激活了查詢組件,但沒有任何結果! 因此,節點保持折疊狀態。 如果我再次單擊+號以展開樹,它將加載檢查! 並且此后每次都會加載它們。

因此,在應用程序中,有一個日期選項默認為今天的日期。 如果我將其更改為昨天的日期,則仍會得到今天的支票...好像參數沒有更新。 而且,如果我從一開始就嘗試從其他日期開始,那么我將不會獲得任何結果! 它會帶來帶有今天日期的結果,但是此后它將不接受其他日期。

我調試了代碼,並且日期在更改,但是由於某些原因,參數沒有更改。 這是我的代碼塊:

checkload1->Filter="" ;
checkload1->Filtered=false ;
switch(params)
    {
    case 0: checkload1->Parameters->Items[0]->Value = 1; // BEN param
            checkload1->Parameters->Items[1]->Value = 1;
            checkload1->Parameters->Items[3]->Value = 1;
            checkload1->Parameters->Items[4]->Value = 1;
            // ALEX Param
            checkload1->Parameters->Items[5]->Value = 0;
            checkload1->Parameters->Items[6]->Value = 0;
            checkload1->Parameters->Items[9]->Value = 0;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS NOT IN ('Refunded', 'Posted') ";
            break ;
    case 1: checkload1->Parameters->Items[0]->Value = 0; // BEN param
            checkload1->Parameters->Items[1]->Value = 0;
            checkload1->Parameters->Items[3]->Value = 0;
            checkload1->Parameters->Items[4]->Value = 0;
            checkload1->Parameters->ParamByName("DATE")->Value=FormatDateTime("dd-mmm-yyyy", Date()) ;
            checkload1->SQL->Strings[13] = " ";
            break ;
    case 2: checkload1->Parameters->Items[0]->Value = 2; // BEN param
            checkload1->Parameters->Items[1]->Value = 2;
            checkload1->Parameters->Items[3]->Value = 2;
            checkload1->Parameters->Items[4]->Value = 2;
            //ALEX param
            checkload1->Parameters->Items[5]->Value = 2;
            checkload1->Parameters->Items[6]->Value = 2;
            checkload1->Parameters->Items[9]->Value = 2;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Deposited') ";
            break ;
    case 3: checkload1->Parameters->Items[0]->Value = 3; // BEN param
            checkload1->Parameters->Items[1]->Value = 3;
            checkload1->Parameters->Items[3]->Value = 3;
            checkload1->Parameters->Items[4]->Value = 3;
            //ALEX param
            checkload1->Parameters->Items[5]->Value = 0;
            checkload1->Parameters->Items[6]->Value = 0;
            checkload1->Parameters->Items[9]->Value = 0;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Held') ";
            break ;
    }
if(!mainform->date1->Checked){
checkload1->Parameters->Items[5]->Value = 1;
checkload1->Parameters->Items[6]->Value = 1;
checkload1->Parameters->Items[9]->Value = 1;
}
checkload1->Parameters->Items[7]->Value = FormatDateTime("dd-mmm-yyyy", fromdate);
checkload1->Parameters->Items[10]->Value = FormatDateTime("dd-mmm-yyyy", fromdate);
checkload1->Parameters->Items[8]->Value = FormatDateTime("dd-mmm-yyyy", todate);
checkload1->Parameters->Items[11]->Value = FormatDateTime("dd-mmm-yyyy", todate);

if(filters != "") checkload1->SQL->Strings[12] = filters;
else checkload1->SQL->Strings[12]=" " ;
checkload1->Prepared = true;
checkload1->Active=true ;

有經驗的人可以在這方面給我建議嗎?

我知道這是古老的東西,但是這些程序實際上是在15到20年前編寫的,它們正在遷移到基於Web的用戶界面,但仍在構建中。 在此之前,我需要進行必要的更改/更新,這是我工作的一部分。

好吧,我有這個工作!

對於任何想在Windows 7 64位上使用BDE奮斗的人,這是一個解決方案! 記住我要處理的數據庫是使用C ++ Builder 6構建的Oracle 8i和Borland C ++應用程序。

跟隨照片和箭頭。 我試圖在每張照片上添加自己的評論,但是這個網站說我不能發布超過2個鏈接...與他們交到地獄,所以我將所有鏈接都放在一張照片上。

按照箭頭,希望您可以將其與下面我的評論聯系起來。

例如,此TQuery正在尋找bnetdata作為數據庫。 很好,在下一張圖片中,我們添加了一個ADOConnection組件

單擊突出顯示的連接字符串。

選擇使用連接字符串,然后單擊構建。

選擇突出顯示的提供程序,然后單擊下一步。

選中使用數據源名稱,然后單擊箭頭以選擇一個。 請注意,稍后您將輸入用戶名和密碼,然后選中允許保存密碼。

選擇與BDE組件使用相同的數據源。 請注意,這是ODBC管理器中系統DSN下的來源之一。 如果不存在,請創建一個。

這是ODBC管理器的快照。 請注意,這仍然是XP環境。 您將需要在Windows 7計算機中創建相同的數據源(在我的情況下為bnetdata)。

現在單擊高級,然后從列表中檢查讀寫選項。

在ADOConnection組件上單擊“確定”之后,就像您現在在對象檢查器中看到的那樣。 查看突出顯示的區域。 現在,我們需要將connected屬性設置為true。 當您這樣做時,它將要求您登錄數據庫。 輸入用戶名和密碼,然后單擊確定。 現在,連接屬性將變為true。 之后,您需要將LoginPrompt屬性設置為false。 現在,單擊保存在項目上。

因此,假設您也有BDE數據庫組件,單擊它,然后清除別名和驅動程序名稱,然后將數據庫名稱放在databaseName屬性下(在我的情況下為bnetdata)。

保存項目並在XP中編譯。 復制該應用程序並將其粘貼到Windows 7計算機中,然后雙擊它,它將起作用! 我已經成功地將所有應用程序轉換為可以在Windows 7上運行。最困難的部分是安裝Borland,並使Windows 7能夠識別ODBC管理器中“驅動程序”選項卡下的Oracle ODBC驅動程序。

同樣,Borland安裝隨附的SQL Explorer無法正常工作。 因此,我仍然需要在Windows XP VM中進行開發,但用戶可以使用Windows 7 VM中的應用程序作為Windows服務器上的終端...對我有用!

希望這對某人有幫助!

編輯:

我還在ADOConnection中嘗試了Oracle的Microsoft OLE DB Provider for Oracle,它也起作用了。 沒有發現對速度或性能有可測量的影響。 兩者似乎以相同的方式執行。 我感到驚訝的是,添加ADOConnection組件如何使應用程序連接到數據庫並像在XP中一樣工作!

同樣,為了清除問題,您無需更改應用程序中的BDE組件。 只需添加ADOConnection,所有其他組件保持不變(BDE組件)。 我試圖轉換為使用ADO組件,但不再需要了。

適用於Oracle的Microsoft OLE DB提供程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM