如何从代码中为MQQueueManager设置CCSID

本文关键字:MQQueueManager 设置 CCSID 代码 | 更新日期: 2023-09-27 18:10:33

我有一些奇怪的问题。我认为我遵循文档正确,但我的代码不工作。我有这个非常简单的硬编码测试(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

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

如何从代码中为MQQueueManager设置CCSID

嗯,我找到了一个解决方法-它可能可以解决我的问题,但我不是很满意。我可以全局设置MQCCSID环境变量或通过调用:

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

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

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

HKEY_LOCAL_MACHINE ->系统-> CurrentControlSet ->控制-> Nls ->代码页> OEMCP价值。

我有一个web应用程序(web表单),只与第二个解决方案

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