1

我遇到了由我们的 CRM 系统控制的 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 控制的文档首先会破坏字符编码。

4

1 回答 1

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);

或通过Oracle.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);
于 2010-07-01T13:15:21.870 回答