2010-06-16 55 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); 
相关问题