Как запустить другую программу/исполняемый .exe файл из кода C#

Задача: из программы на C# запустить другую программу (исполняемый файл). В теории все просто

 System.Diagnostics.Process.Start(pathToFileString); 

Но есть нюанс, если запускаемая программа находится в другом каталоге и использует для получения инофрмации о текущем каталоге функцию Directory.GetCurrentDirectory, то она получит вместо собственного каталога каталог исходной программы, из которой и запускается второй исполняемый файл.

Вылечить это можно двумя способами.
Читать далее

Как переименовать проект/каталог проекта в Visual Studio?

Задача: полностью переименовать решение Visual Studio, включая каталоги проекта и решения, название исполняемого файла и пространство имен. Решение несколько неочевидно, пройдем по шагам:

  1. Делаем резервную копию папки с решением.
  2. Решение и проект переименовываем в студии
  3. Имя исполняемого .exe файла изменяем в свойствах проекта - поле Assembly name
  4. Для переименования пространства имен используем встроенную функцию рефакторинга - выделяем в одном из файлов название и в контекстном меню выбираем Refactor->Rename
  5. Читать далее

Ловим ошибки в запросе к MS SQl и откатываем изменения - транзакции (transaction) и блок TRY-CATCH

Имеем запрос, меняющий данные на MS SQL Server. Задача: отловить возникшие при выполнении запроса ошибки и откатить все уже внесенные внутри запроса изменения к состоянию на момент его запуска. Помогут нам в этом нелегком деле транзакции и блок TRY-CATCH. Когда вообще возникает необходимость? Типичный пример из учебника, последовательное удаление двух строк из разных таблиц, имеющих один и тот же код:

DELETE FROM SOME_TABLE1 WHERE SOME_ID = SOME_VALUE
DELETE FROM SOME_TABLE2 WHERE SOME_ID = SOME_VALUE

Если первый оператор выполнится, а второй нет, нас поразит самое страшное проклятье любого разработчика - рассогласование данных в базе. Само собой возможно множество других ситуаций, когда частичное выполнение запроса приведет к большим проблемам.

Транзакция - это последовательность операций, которая должна или полностью выполниться успешно или не выполнится вообще. В Transact Sql она начинается командой BEGIN TRANSACTION и продолжается до выполнения команды отката ROLLBACK TRANSACTION или подтверждения COMMIT TRANSACTION. Само собой команду отката надо выполнять в случае ошибок. Как их отследить? Теоретически есть переменная @@ERROR, содержащая код ошибки или 0 в случае успешного выполнения, но на практике такой код писать нельзя
Читать далее

Ошибка при работе с Word (Interop) в C# - "Заглушке переданы неправильные данные / Stub recieved bad data"

Редкая и экзотическая ошибка, способная при удачном стечении обстоятельств съесть значительную часть мозга среднестатистического программиста. У меня она проявилась на одной-единственной машине, ничем не отличавшейся от остальных (XP SP3, Office 2003), куда программу установили из чистого любопытства. Симптомы просты: вылет метода Execute интерфейса Find с крайне невнятной ошибкой "Заглушке переданы неправильные данные / Stub recieved bad data". Изюминка данной ошибки в том, что это глюк в интерфейсе Interop.Word, официально признанный Microsoft и распространяющийся на интерфейсы Find, Replacement, Dictionary, ReadabilityStatistics, ReadabilityStatistic и библиотеки Word версий 8.0, 8.1, 10.0 и 11.0.

Причина ошибки еще интересней. Word использует глобальные уникальные идентификаторы (Globally Unique Identifiers, GUIDs), которые ранее использовались Excel 95. Если библиотека Excel 95 была зарегистрирована в системе позднее библиотеки Word, то эти идентификаторы начинают указывать на библиотеку Excel. В результате COM может построить неправильную таблицу-посредника (proxy v-table) для клиентов вне процесса (out-of-process client ), использующих раннее связывание с Word. В итоге запросы к этой таблице вызывают либо ошибку либо падение, так как вместо Word передаются в Excel. Только не спрашивайте меня, каким образом библиотека Excel 95 могла зарегистрироваться в системе после библиотеки Word 2003. Подробности можно найти с следующих статьях BUG: NWFREADME: Word Interoperability Sample Generates An Exception Error Using the Word Find Object и Automation client receives an error message or crashes when the client calls the Find object in Word, я же перейду к самом интересному - работающему коду решения проблемы.
Читать далее

Устанавливаем выбранное по умолчанию значение в DataGridViewComboBoxColumn - аналог SelectedValue и SelectedIndex

Имеем колонку ComboBox в составе DataGridView связанную с источником данных (по этой схеме). Задача: изменить выбранное по умолчанию значение в выпадающих списках колонки.

При работе с обычным ComboBox используются свойства SelectedIndex, SelectedValue и т.д. В ComboBoxColumn их нет. Вообще. В английском интернете предлагают отдельно обрабатывать каждую ячейку ComboBox-колонки, устанавливая значение Value. Но есть более простой способ. Вспомним, что колонка комбо-боксов связана с двумя таблицами одновременно - в одной, источнике данных для колонки комбо-боксов, хранится справочник код-значение, вторая служит источником данных для всего DataGridView и в одном из столбцов хранит выбранный в комбо-боксе код. И если этому столбцу прописать значение по умолчанию, то в DataGridViewComboBoxColumn будет по умолчанию выбираться элемент с соответствующим кодом. Все!

Еще раз отошлю к наглядной схеме, так как в письменном виде это выглядит очень запутанным.

Достаточность интеллекта...

Отлаживать код вдвое сложнее, чем писать. Поэтому, если при написании программы вы используете весь свой интеллект, вы по определению недостаточно умны, чтобы ее отладить.
Брайан Керниган (Brayan W Kernigan)

Не бывает кода, настолько громоздкого, изощренного или сложного, чтобы его нельзя было ухудшить при сопровождении.
Джеральд Вайберг (Gerald Weinberg)

Особенности работы с ComboBoxColumn в DataGridView

Имеем DataGridView связанный с некоторой таблицей. Необходимо создать в нем колонку выпадающих списков ComboBox, элементы которых будут заполняться из другой таблицы, содержащий тексты элементов комбокса и коды. Во время работы нам надо получить выбранной код для каждой строки.

Делается это несложным, но крайне неочевидным способом. В таблице-источнике данных для датагрида нам надо добавить столбец для выбранного кода. Для столбца с комобоксами типа DataGridViewComboBoxColumn нам нам надо указать источником данных таблицу-справочник, а в свойство DataPropertyName занести столбец для выбранного кода из таблицы-источника данных для всего DataGridView. После чего выбранные данные будут автоматически транслироваться в таблицу-источник данных для даатагрида через механизм привязки. Чтобы у вас голова окончательно не пошла кругом я заготовил небольшую схему (BindingSource посредники на ней опущены):

DataGridViewComboBoxColumn
Читать далее

Ошибка в коде, из-за которой телефонная сеть Нью-Йорка не работала 9 часов

Из-за этой ошибке в коде на C++ 15 января 1990 года телефонная сеть Нью-Йорка была выведена из строя на 9 часов.

do
{
    ... 
    switch
        ...
        if () 
        {
            ...
            // этот break предназначался для if, но на самом деле приводил к выходу из switch
            break;
            ... 
        }
        ...
} while ( ... );

Пример взят из книги С. Макконнелл Совершенный код. Мастер-класс Code Complete

Програмисты на вес золота

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

Архитектура [программы] не должна быть похожа на бюджет Конгресса США, включающий расходы на мероприятия, повышающие популярность чиновников.

Прежде всего следует узнать, не что система выполняет, а над ЧЕМ она это выполняет. (Бертран Майер/Bertrand Mayer)

С. Макконнелл Совершенный код. Мастер-класс Code Complete

Новые функции в программе и клиенты

Думая о новой функции, клиенты приходят в возбуждение. Кровь у них разжижается, переполняет продолговатый мозг и они впадают в эйфорию, забывая о всех собраниях, посвященных обсуждению требований, о церемонии подписания и всех документах. Угомонить таких одурманенных новыми функциями людей проще всего, заявив: "Ого, это действительно прекрасная идея! Но ее нет в документе требований, поэтому я должен пересмотреть график работы и смету, чтобы вы могли решить, хотите вы реализовать это прямо сейчас или позднее". Слова "график" и "смета" отрезвляют куда лучше, чем кофе и холодный душ, и многие требования быстро превращаются в пожелания.

С. Макконнелл Совершенный код. Мастер-класс Code Complete