【问题标题】:How to set CCSID for MQQueueManager from code?如何从代码中为 MQQueueManager 设置 CCSID?
【发布时间】:2017-05-24 17:08:43
【问题描述】:

我有一些奇怪的问题。我认为我正确地遵循了文档,但我的代码不起作用。我有这个非常简单的硬编码测试(NUnit):

[TestFixture]
public class MQQueueTests {

    public const string MessageContent = "<test>This is test message</test>";

    public static void Main(string[] args) {
        var tests = new MQQueueTests();
        tests.PutAndGetMessage();
    }

    [Test]
    public void PutAndGetMessage() {
        var properties = new Hashtable
                             {
                                 {MQC.HOST_NAME_PROPERTY, "TestServer"},
                                 {MQC.CHANNEL_PROPERTY, "Test.Channel"},
                                 {MQC.PORT_PROPERTY, 1415},
                                 // Is this correct? It looks like it is not 
                                 // enough because adding this line didn't solve 
                                 // the problem.
                                 {MQC.CCSID_PROPERTY, 437}  
                             };

        using (var manager = new MQQueueManager("Test.Queue.Manager", properties)) {
            using (MQQueue queue = manager.AccessQueue("Test.Queue", 
                MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) {

                MQMessage message = new MQMessage();
                message.WriteUTF(MessageContent);
                queue.Put(message);

                MQMessage readMessage = new MQMessage();
                queue.Get(readMessage);

                Assert.AreEqual(MessageContent, readMessage.ReadUTF());

                queue.Close();
            }
            manager.Disconnect();
        }
    }
}

我正在从控制台或通过 Resharper 6 测试运行程序运行测试应用程序。如果我在测试运行器中运行应用程序,我总是会遇到以下异常:

IBM.WMQ.MQException : MQRC_CHANNEL_CONFIG_ERROR(原因码是 2539)

异常由MQQueueManager.Connect(由其构造函数调用)引发。

如果我检查 MQ 日志,我会看到:

AMQ9541:不支持为数据转换提供的 CCSID。

解释:程序结束,因为源 CCSID '437' 或目标 CCSID '852' 无效,或当前不受支持。

操作:更正无效的 CCSID,或确保 可以支持请求的 CCSID。

如果我从控制台运行应用程序,我会遇到同样的错误,但如果我通过调用更改控制台的代码页

chcp 437

我的测试应用程序有效。如何从代码配置代码页?

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    好吧,我找到了一种解决方法 - 它可能可以解决我的问题,但我对它不是很满意。我可以全局设置MQCCSID 环境变量,也可以调用:

    Environment.SetEnvironmentVariable("MQCCSID", "437");
    

    这将配置代码页。我仍然想使用新的MQQueueManager 实例的属性来设置代码页。

    【讨论】:

      【解决方案2】:

      这两个答案都是正确的。对于 Windows 窗体项目,将环境变量 MQCCSID 设置为与您尝试连接的队列管理器的 ccsid 相同就足够了。 - 第二种解决方案

      HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Control->Nls->CodePage>OEMCP 值。

      我有一个仅适用于第二种解决方案的 Web 应用程序(Web 表单)

      【讨论】:

        【解决方案3】:

        在 Windows 7 区域设置 -> 管理 -> 更改系统区域设置上将系统区域设置更改为英语(美国)。同样在这样做之后,您可以在 regedit 值中检查它。 regedit->HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Control->Nls->CodePage 检查 OEMCP 值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多