Как установить CCSID для MQQueueManager из кода? - PullRequest
0 голосов
/ 05 октября 2011

У меня странная проблема. Я думаю, что следовал документации правильно, но мой код не работает. У меня есть очень простой жесткий кодовый тест (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 ]

1 голос
/ 05 октября 2011

Ну, я нашел обходной путь - он может решить мою проблему, но я не очень доволен этим.Я могу установить переменную окружения MQCCSID глобально или по телефону:

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

Это настроит кодовую страницу.Тем не менее я хотел бы использовать свойства нового экземпляра MQQueueManager для настройки кодовой страницы.

0 голосов
/ 24 мая 2017

Оба ответа верны. Для Windows Forms Project достаточно указать переменную среды MQCCSID, аналогичную ccsid диспетчера очереди, который вы пытаетесь подключить. - 2-й раствор

HKEY_LOCAL_MACHINE-> SYSTEM-> CurrentControlSet-> Control-> Nls-> CodePage> Значение OEMCP.

У меня было веб-приложение (веб-формы), которое работало только со вторым решением

0 голосов
/ 04 ноября 2011

изменить язык системы на английский (США) в Windows 7 Региональные настройки -> Административный -> Изменить язык системы.также после этого вы можете проверить его в значении regedit.regedit-> HKEY_LOCAL_MACHINE-> SYSTEM-> CurrentControlSet-> Control-> Nls-> CodePage проверяет значение OEMCP.

...