views:

58

answers:

1

I'm facing a problem with a MS Word DDE Automation controlled by our CRM system.

The setup

Base for the document created is a Word .dot template which fires a macro on Document.New. Inside this macro I create a .Net component registered for COM.

Set myCOMObject = CreateObject("MyCOMObject")

The component pulls some data from a database and hands string values which are assigned to Word DocumentVariables.

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

All string values returned from the component are encoded in UTF-16 (codepage 1200).

What happens

The problem arises when the CRM system calls Word to create a new doc by DDE (winword.exe /n /dde): The string values from the component are turned into UTF-8 encoded strings.

All the static text inside the template stays nicely encoded in UTF-16 - example the umlaut ü inside my DocumentVariables is turned into c3 b0 while it stays fc for the rest of the document (checked file in hex editor).

If I'm creating a document from a template with the same macro functionallity directly (without DDE) all strings are fine; i.e. are encoded in UTF-16.

Side effects If I create a new document from my template, keep this document open and create a new document controlled by DDE the characters are encoded correctly!

This also works the other way round: creating a DDE controlled document first breaks the character encoding when creating a second document directly.

A: 

As it turns out the solution is to replace the database access via 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);

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

Or by 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);
Filburt