Как установить CCSID для MQQueueManager из кода?

#c# #.net #ibm-mq

#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 test runner. Если я запускаю приложение в тестовом режиме, я всегда получаю следующее исключение:

IBM.WMQ.MQException : ошибка MQRC_CHANNEL_CONFIG_ERROR (код причины — 2539)

Исключение генерируется MQQueueManager.Connect (вызывается его конструктором).

Если я проверяю журналы MQ, я вижу:

AMQ9541: CCSID, предоставленный для преобразования данных, не поддерживается.

ОБЪЯСНЕНИЕ: программа завершилась, потому что либо исходный CCSID ‘437’, либо целевой CCSID ‘852’ недействителен или в настоящее время не поддерживается.

ДЕЙСТВИЕ: исправьте недопустимый CCSID или убедитесь, что запрошенный CCSID может поддерживаться.

Если я запускаю приложение с консоли, я получаю ту же ошибку, но если я изменю кодовую страницу для консоли, вызвав

 chcp 437
  

Мое тестовое приложение работает. Как я могу настроить кодовую страницу из кода?

Ответ №1:

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

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

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

Ответ №2:

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

HKEY_LOCAL_MACHINE-> SYSTEM-> CurrentControlSet->Control-> Nls-> Кодовая страница> Значение OEMCP.

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

Ответ №3:

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