關於 BCB6 轉 XE7 程式碼問題 |
答題得分者是:aftcast
|
clajeke
一般會員 發表:8 回覆:14 積分:4 註冊:2011-10-17 發送簡訊給我 |
以前 (BCB6) 用來創建 Access 時會用以下程式碼
[code cpp] AccessMDB = Variant::CreateObject("ADOX.Catalog"); //取得物件 AccessMDB.OleProcedure("Create",ConnectionString.c_str()); //建立檔案 AccessMDB = Unassigned; [/code] 可是在 XE7 上編譯時 一直卡在這行 AccessMDB.OleProcedure("Create",ConnectionString.c_str()); 後來用 debug 模式看 輸出的字串裡面不知為何會有 " . " 可是非 Debug 模式下在Memo上輸出的字串沒問題 用Debug 就會看到 " . " 不知道大家是否遇過有解 或是否有生成 Access XE7 可以用的方法 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
clajeke
一般會員 發表:8 回覆:14 積分:4 註冊:2011-10-17 發送簡訊給我 |
小弟做了兩個實驗
先附上原始程式碼 下面四個都是 String 類型 Form1->WinAPI.WinSt.abslocal ASt.FolderN ASt.AccessN Data 當 AnsiString ConnectionString; //連接字串 AnsiString MDBFileName; [code cpp] Variant AccessMDB ; //ADOX 物件 AnsiString ConnectionString; //連接字串 AnsiString MDBFileName; //MDBFileNmae = ExtractFilePath(Application->ExeName) "test.mdb"; //MDB 檔產生位置 MDBFileName = Form1->WinAPI.WinSt.abslocal ASt.FolderN "" ASt.AccessN Data ".mdb"; //MDB 檔產生位置 ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " MDBFileName; //設定連接字串Microsoft.Jet.OLEDB.4.0 Microsoft.ACE.OLEDB.12.0 AccessMDB = Variant::CreateObject("ADOX.Catalog"); //取得物件 Form1->Memo1->Lines->Add(ConnectionString); //if (FileExists(MDBFileName)) DeleteFile(MDBFileName); AccessMDB.OleProcedure("Create",ConnectionString.c_str()); //建立檔案 AccessMDB = Unassigned; [/code] 錯誤是這樣 錯誤的變數類型。 . 可是當我把 當 AnsiString ConnectionString; //連接字串 AnsiString MDBFileName; 改成 String ConnectionString; //連接字串 String MDBFileName; 錯誤是 Microsoft Jet 資料庫引擎無法開啟 XXXX 檔案,他已經被其他使用者獨佔地開啟 可是重點是根本沒有產生檔案..... |
clajeke
一般會員 發表:8 回覆:14 積分:4 註冊:2011-10-17 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我看到你有不少的字串相關的問題。所以,我還是附加一下說明,希望不要只是把魚給你吃,但下次可能還是會遇到怪事。
在 c builder 裡,有三種字串, 1/ ansistring 2/ unicodestring 3/ widestring string 這關鍵字則是因不同的delphi/cb 版本,會印射到 1 或 2 的情形。 d2009後是2。之前則對應1。 把常數字元給他的方式是 AnsiString foo = "this is a test" UnicodeString bar = L"this is a test" WideString foobar = L"this is a test" 只有 ansistring 前面是不要加 L 的。 或許你會說,許多時候你沒加,也ok。是的,那是靠 compiler 幫你背後偷轉,但它轉的情形你真的可信? 除非你已經對compiler的行為非常了解,或許你就可以偷懶。但我真心建議良好的c/c 程式習慣是型別是什麼就放入正確的,函式要什麼,就給正確的型別,不要讓compiler自己去轉成不可遇期的。 另補充,widestring 是幹麻的? 簡單說就是為了 win32的com元件而生,所以凡com元件,理當以它來處理所有字串問題。(它也是unicode,但有一點點結構上的不同,若想了解就要去了解什麼是bstr )。 官方的help 檔其實也是有錯誤。OleProcedure 裡說可以放string,實測就是錯(我也測出你遇到的問題)。所以我不管它是什麼,我就是用widestring就一定正確,它為它而生的,剛說過。 你的程式碼我會改成這樣嚴僅一點的寫法: Variant AccessMDB ; //ADOX 物件 WideString MDBFileName; MDBFileName = L"C:UsersHughDocumentssam.mdb"; //MDB 檔產生位置 ConnectionString = WideString(L"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = ") MDBFileName; //設定連接字串Microsoft.Jet.OLEDB.4.0 Microsoft.ACE.OLEDB.12.0 AccessMDB = Variant::CreateObject(L"ADOX.Catalog"); //取得物件 AccessMDB.OleProcedure(L"Create",ConnectionString.c_bstr()); //建立檔案 // AccessMDB = Unassigned;
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
clajeke
一般會員 發表:8 回覆:14 積分:4 註冊:2011-10-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |