2010-06-16 26 views
1

我正在面對由我們的CRM系統控制的MS Word DDE自動化問題。MS Word DDE:什麼會破壞我的編碼?

的設置

基地創建的文件是Word .DOT模板,觸發上Document.New宏。在這個宏內部,我創建了一個爲COM註冊的.Net組件。

Set myCOMObject = CreateObject("MyCOMObject") 

該組件從數據庫中提取一些數據並提取分配給Word DocumentVariables的字符串值。

Set someClass = myCOMObject.GetSomeClass(123) 
ActiveDocument.Variables("docaddress") = someClass.GetSenderAddress(456) 

從組件返回的所有字符串值都以UTF-16編碼(代碼頁1200)。

會發生什麼

當CRM系統調用Word創建的DDE(WINWORD.EXE/N/DDE)的一個新的文檔,問題出現了:從組件的字符串值都變成UTF-8編碼字符串。

所有模板中的靜態文本撐很好地編碼UTF-16 - 例如變音ü我DocumentVariables內變成C3 B0,同時它保持FC對文檔的其餘部分(檢查文件在十六進制編輯器)。

如果我使用直接具有相同宏函數的模板創建文檔(沒有DDE),所有字符串都可以;即以UTF-16編碼。

副作用 如果我創建從我的模板的新文檔,保持這個文件打開和創建通過DDE控制的一個新的文檔中的字符編碼正確!

這也適用於其他方式:創建DDE受控文檔時,首先會在直接創建第二個文檔時打破字符編碼。

回答

0

事實證明的解決辦法是更換通過數據庫訪問System.Data.OleDb

OleDbCommand command = new OleDbCommand(query, connection); 

OleDbParameter companyIdParam = command.CreateParameter(); 
companyIdParam.ParameterName = "companyId"; 
companyIdParam.Direction = ParameterDirection.Input; 
companyIdParam.OleDbType = OleDbType.Integer; 
companyIdParam.Value = companyId; 
command.Parameters.Add(companyIdParam); 

通過System.Data.OracleClient的

OracleCommand command = new OracleCommand(query, connection); 

OracleParameter companyIdParam = command.CreateParameter(); 
companyIdParam.ParameterName = "I_COMPANYID"; 
companyIdParam.Direction = ParameterDirection.Input; 
companyIdParam.OracleType = OracleType.Number; 
companyIdParam.Value = companyId; 
command.Parameters.Add(companyIdParam); 

或者通過甲骨文.DataAccess.Client

OracleCommand command = new OracleCommand(query, connection); 

OracleParameter companyIdParam = command.CreateParameter(); 
companyIdParam.ParameterName = "companyId"; 
companyIdParam.Direction = ParameterDirection.Input; 
companyIdParam.DbType = DbType.Int32; 
companyIdParam.Value = companyId; 
command.Parameters.Add(companyIdParam); 
相關問題