代码之家  ›  专栏  ›  技术社区  ›  Filburt kukabuka

什么会破坏我的编码?

  •  1
  • Filburt kukabuka  · 技术社区  · 14 年前

    我面临一个由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编码-例如 乌姆劳特 在我的文档中,变量被转换为 C3B0 当它停留 FC 对于文档的其余部分(在十六进制编辑器中选中的文件)。

    如果我从一个具有相同宏功能的模板直接(不使用DDE)创建一个文档,那么所有字符串都是好的;即,都是用UTF-16编码的。

    副作用 如果我从模板创建新文档,请保持此文档打开并创建由DDE控制的新文档,字符编码正确!

    另一方面,这也起作用:当直接创建第二个文档时,首先创建一个DDE控制的文档会中断字符编码。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Filburt kukabuka    14 年前

    事实证明,解决方案是通过 系统数据.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.oracle客户端

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