1

CRMシステムによって制御されるMSWordDDE自動化で問題が発生しています。

セットアップ

作成されるドキュメントのベースは、Document.Newでマクロを起動するWord.dotテンプレートです。このマクロ内に、COMに登録された.Netコンポーネントを作成します。

Set myCOMObject = CreateObject("MyCOMObject")

コンポーネントはデータベースからいくつかのデータを取得し、WordDocumentVariablesに割り当てられた文字列値を渡します。

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内のumlautüはc3 b0に変換され、ドキュメントの残りの部分はfcのままです(16進エディターでチェックされたファイル)。

同じマクロ機能を持つテンプレートから直接(DDEなしで)ドキュメントを作成している場合、すべての文字列は問題ありません。つまり、UTF-16でエンコードされます。

副作用 テンプレートから新しいドキュメントを作成する場合は、このドキュメントを開いたままにして、DDEによって制御される新しいドキュメントを作成すると、文字が正しくエンコードされます。

これは逆の場合にも機能します。DDE制御のドキュメントを作成すると、2番目のドキュメントを直接作成するときに、最初に文字エンコードが壊れます。

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 に答える