如何从代码中为MQQueueManager设置CCSID?

时间:2011-10-05 11:52:07

标签: c# .net ibm-mq

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

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

3 个答案:

答案 0 :(得分:1)

我发现了一个解决方法 - 它可能解决了我的问题,但我对此并不十分满意。我可以全局设置MQCCSID环境变量,也可以调用:

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

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

答案 1 :(得分:0)

在Windows 7区域设置 - &gt;上将您的系统区域设置更改为英语(美国)管理 - &gt;更改系统区域设置。也可以在执行此操作后以regedit值检查它。 regedit-&gt; HKEY_LOCAL_MACHINE-&gt; SYSTEM-&gt; CurrentControlSet-&gt; Control-&gt; Nls-&gt; CodePage检查OEMCP值。

答案 2 :(得分:0)

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

  

HKEY_LOCAL_MACHINE-&gt; SYSTEM-&gt; CurrentControlSet-&gt; Control-&gt; Nls-&gt; CodePage&gt; OEMCP值。

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