1. 產品概述
1.1 產品功能
提供轉檔元件,可用程式串接該元件,打入自定義的查詢語法,來取用CMoney財經資料庫的資源。
1.2 產品項目
| 元件名稱 | 產品名稱 | 功能 |
|---|---|---|
| cmadox.dll | CMADODB |
|
| cmadox5.dll | CMADODB5 |
|
1.3 產品限制
- 查詢返回筆數 <= 60萬筆
1.4 環境需求
- Windows XP 或 Windows Server 2008 以上作業系統
- 如果以Office VBA來串接元件,Office版本須為32位元。
2. 安裝與部署
2.1 安裝與註冊流程
- 請下載安裝檔到本機。
- 請以系統管理員執行該安裝檔,並且按下[安裝]。

- 安裝程式會將元件放到系統資料夾底下,並且進行註冊,執行後會自動關閉。
2.2 手動註冊流程
有時候可能因為權限或環境問題,安裝檔無法註冊元件成功時,請參照以下流程處理。
| 電腦OS位元 | 系統資料夾路徑 | cmd指令 |
|---|---|---|
| 32位元 | C:\Windows\System32 |
regsvr32 cmadox.dll |
| 64位元 | C:\Windows\SysWOW64 |
regsvr32 C:\Windows\SysWOW64\cmadox.dll |
- 請將安裝檔解壓縮,解壓縮後的資料夾內應該會有cmadox.dll或cmadox5.dll。
- 請先查詢您的電腦OS位元
- 參照上表,找到您的系統資料夾路徑。
- 將1得到的.dll檔,放到系統資料夾路徑下。
- 以系統管理員身分開啟cmd(或左下角>搜尋>輸入"執行">會跳出一個執行視窗)

- 在命令行中(或執行的藍框中)輸入對應的cmd指令,並且執行。
2.3 Windows Server 主機註冊特別事項
如果您的OS環境為Windows Server,請對COM+進行註冊。
請參照COM+操作文件[點我連結]
- COM+元件註冊後,請將專案透過進階設定將[啟用32位元應用程式]選擇為TRUE(Adox元件不支援建置目標64位元的專案)

2.4 錯誤訊息與Log紀錄
當元件未預期執行時,可以到↓查看是否有Log紀錄,再提交給CMoney人員。
C:\Program Files (x86)\CMoney\CMAdox_LOG\
C:\Program Files\CMoney\CMAdox_LOG\
C:\Users\user1\AppData\Roaming\
*user1是當前登入帳戶名稱
3. 使用指南
3.1 基本使用方法
3.1.1 輸入參數說明
| 產品名稱 | 方法名稱 | 輸入參數 | SQL查詢語法 示例 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CMADODB | Execute |
|
SELECT * FROM 日收盤表排行 WHERE (日期 = '20041110') ORDER BY 股票代號 | ||||||||||||||||||||
| CMADODB | Execute |
|
SELECT * FROM 技術與籌碼面速覽 | ||||||||||||||||||||
| CMADODB | Execute |
|
基本面篩選/月營收動能向上/20060207
|
||||||||||||||||||||
| CMADODB5 | CMExecuteOLEDB |
|
SELECT * FROM 日收盤表排行 WHERE (日期 = '20041110') ORDER BY 股票代號" | ||||||||||||||||||||
| CMADODB5 | CMExecuteSQLNCLI11
可用TLS1.2協定來查詢資料。 |
同上 | 同上 |
3.1.2 輸出說明
返回ADODB.RecordSet型態的資料集合
其他屬性
.ErrorMessage:取得錯誤訊息
3.2 動態連結代號
- 可以使用<CM 與 > 標籤,來決定要設定的動態連結代號。
- 標籤內用逗號來分隔參數 台股 <CM參數1,參數2>;非台股 <CM參數1,參數2,參數3,參數4>
| 項目 | 語法 | SQL查詢語法 示例 |
|---|---|---|
| 台股–交易所代號 | <CM代號,1> | SELECT * FROM [季財報(現金流量單季)] WHERE 年季='201003' AND 股票代號 IN <CM代號,1> |
| 台股–細產業分類 | <CM產業,303> | SELECT * FROM [季財報(現金流量單季)] WHERE 年季='201003' AND 股票代號 IN <CM產業,303> |
| 台股–個股特殊分類(不含指數彙編) | <CM特殊,1> | SELECT * FROM [季財報(現金流量單季)] WHERE 年季='201003' AND 股票代號 IN <CM特殊,1> |
| 非台股 | <CM一般,日本,重要國際指數,國家> | SELECT * FROM [重要國際指數] WHERE 日期='20110120' AND 代號 IN <CM一般,日本,重要國際指數,國家> |
| 同上 | 同上 | SELECT * FROM [重要國際指數] WHERE 日期='20110120' AND 代號 IN <CM一般,日本,重要國際指數,國家> SELECT * FROM [權證基本資料表] WHERE 年度='2011' AND 代號 IN <CM一般,一般型認售權證,權證基本資料表,類型> |
資料表前後請留空白,若表格名稱內含有中括號,則表格名稱請不要再用中括號包住
4. 開發整合
4.1 C#串接說明
4.1.1 開發環境引用元件
- 開啟程式開發介面(以下以Vistual Studio舉例),並開啟您要開發或維運的專案
- 專案參考設定:
專案 > 參考 > 加入參考 > COM頁籤 > 選擇CMADODB或CMADODB5 > 確定
* PS 選擇清單中可能有很多個相同的項目一起出現,擇一勾選就可以,它會一起勾。
4.1.2 撰寫程式碼以使用元件
[Adox]
/// <summary> /// 查詢指定SQL命令並返回資料表 /// </summary> /// <param name="sqlCommandText">SQL命令</param> /// <returns>查詢結果</returns> public DataTable Execute(string sqlCommandText) { ADODB.Recordset recordset = new ADODB.Recordset(); CMADODB.CMConnection conn = new CMADODB.CMConnection(); try { using (System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter()) { DataTable dt = new DataTable(); recordset = conn.CMExecute("5", sqlCommandText); if (!string.IsNullOrEmpty(conn.ErrorMessage)) { throw new Exception(conn.ErrorMessage); } if (recordset != null && recordset.RecordCount > 0) { adapter.Fill(dt, recordset); return dt; } else { throw new Exception("查無資料"); } } } catch (Exception ex) { throw new Exception($"查詢例外:{ex}"); } finally { if (recordset != null) { if (recordset.State != 0) { recordset.Close(); } recordset = null; } conn = null; } }
[Adox5]
/// <summary> /// 查詢指定SQL命令並返回資料表 /// </summary> /// <param name="sqlCommandText">SQL命令</param> /// <returns>查詢結果</returns> public DataTable Execute(string sqlCommandText) { ADODB.Recordset recordset = new ADODB.Recordset(); CMADODB5.CMConnection conn = new CMADODB5.CMConnection(); try { using (System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter()) { DataTable dt = new DataTable(); recordset = conn.CMExecuteOLEDB("5", "伺服器IP", "伺服器Port", sqlCommandText); if (!string.IsNullOrEmpty(conn.ErrorMessage)) { throw new Exception(conn.ErrorMessage); } if (recordset != null && recordset.RecordCount > 0) { adapter.Fill(dt, recordset); return dt; } else { throw new Exception("查無資料"); } } } catch (Exception ex) { throw new Exception($"查詢例外:{ex}"); } finally { if (recordset!=null) { if (recordset.State != 0) { recordset.Close(); } recordset = null; } conn = null; } }
4.2 範例測試程式
| 產品名稱 | 測試程式(請解壓縮後執行內部的DemoForm.exe) | 程式碼 (請解壓縮後可見原始碼) |
|---|---|---|
| CMADODB | 點我下載 | 點我下載 |
| CMADODB5 | 點我下載 | 點我下載 |
4.3 本方案架構說明
DemoAdox(5).slu
└-- DemoForm.csproj:作為客戶端應用程式,示範外部程式如何去呼叫DemoLib內的類別。
└-- DemoLib.csproj:作為底層,內部主要是包裝adox(5)的查詢以及ADODB.Recordset轉換為DataTable。
5. 常見問題與解決方案
Q: 擷取元件 (CLSID 為 {FA04616C-9B80-4D61-8228-5BC1963E07CB}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
A: 請先嘗試手動註冊流程
Q: 我寫的程式在開發端測試運行沒有問題,但是佈署到IIS或其他主機時,就會出錯。
A: 請先確認遠端目的主機,也有進行元件註冊流程。
Q: 我還是有問題
A: 請聯絡CMoney,並提供Log檔。如果方便,亦請提供串接程式碼(可先自行移除商業邏輯),並告知使用的語言和運行環境。
發表
我的網誌
