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

關於 BCB6 轉 XE7 程式碼問題

答題得分者是:aftcast
clajeke
一般會員


發表:8
回覆:14
積分:4
註冊:2011-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-01-20 16:03:42 IP:59.124.xxx.xxx 訂閱
以前 (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 可以用的方法
附加檔案:54be0bdeb5b71_123.jpg
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-01-20 16:27:18 IP:36.229.xxx.xxx 訂閱
先聲明一下,因為忙,所以我都只能用最快速的經驗與直覺回覆一下。但很可能不對。參考一下就是。

我覺得所有 OLE 下的字串,理當用 WideString 的型別來處理。不要轉型。因為它對應 com 元件上的是 bstr 。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-01-20 16:29:27 IP:36.229.xxx.xxx 訂閱
註: WideString 不等於 D2009後的string (或稱unicodestring)。 更不等於 ansistring。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GrandRURU
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-01-20 17:02:01 IP:59.120.xxx.xxx 未訂閱
clajeke
一般會員


發表:8
回覆:14
積分:4
註冊:2011-10-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-01-20 17:40:04 IP:59.124.xxx.xxx 訂閱
小弟做了兩個實驗
先附上原始程式碼
下面四個都是 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 重新編輯於 2015-01-20 17:41:26, 註解 無‧
clajeke 重新編輯於 2015-01-20 17:43:50, 註解 無‧
clajeke
一般會員


發表:8
回覆:14
積分:4
註冊:2011-10-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-01-20 17:48:27 IP:59.124.xxx.xxx 訂閱
改成 
WideString 就好了 感謝 已給分
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-01-20 18:31:19 IP:114.32.xxx.xxx 訂閱
我看到你有不少的字串相關的問題。所以,我還是附加一下說明,希望不要只是把魚給你吃,但下次可能還是會遇到怪事。

在 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
編輯記錄
aftcast 重新編輯於 2015-01-20 19:48:48, 註解 無‧
aftcast 重新編輯於 2015-01-20 20:09:15, 註解 無‧
clajeke
一般會員


發表:8
回覆:14
積分:4
註冊:2011-10-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-01-20 21:03:23 IP:111.240.xxx.xxx 訂閱
非常感謝大哥的教導
其實我在其他地方也發過文問關於字串的問題
因為最近從 BCB6 要直接切入 XE7
發覺有這個問題而且不太其門知其程式發展的轉變
只發覺 F1 按下去看到一些以前沒看過的東西
很感謝你的教誨
謝謝
系統時間:2024-11-21 17:15:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!