• Как предпочтительнее реализовать связи в БД?

    @Sumor
    Если вы сделаете идентификаторы каждого объекта уникальным в рамках своей БД, то вы можете обойтись одной таблицей связей и в JOIN не нужно будет дополнительно указывать тип связи.
    Например: Объекты типа A имеют идентификаторы вида A1, объекты типа B - B1 и тд. Тогда:
    Таблица A
    A1 Данные 1
    A2 Данные 2
    A3 Данные 3

    Таблица B
    B1 Данные 1
    B2 Данные 2
    B3 Данные 3

    Таблица C
    C1 Данные 1
    C2 Данные 2
    C3 Данные 3

    LNK Таблица связей
    A1 B1
    A1 B3
    C3 B2
    и тд

    Запрос на связи A и B (примерно, без синтаксического разбора):
    SELECT * FROM A JOIN LNK ON A.id = LNK.id1 JOIN B ON LNK.id2 = B.id

    Нужно ещё учесть, что при таком подходе у связей есть направленность: могут быть связи A1-B2 или B2-A1 и нужно иметь это ввиду: либо дублировать при добавлении, либо использовать другие подходы, либо может быть вам направленность связей как раз и нужна.
    Для идентификаторов можно использовать GUID - он гарантированно не будет пересекаться между таблицами, но что-бы определить тип объекта по GUID вам нужно прошерстить все таблицы.
    Ответ написан
    Комментировать
  • Почему не работает русский язык в консоли .NET Core?

    @Sumor
    По умолчанию, в консоли Windows кодировка 866.
    Переключите кодировку перед выводом.
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    Либо переключите консоль в режим UTF-8 в батнике:
    chcp 65001
    Ответ написан
    1 комментарий
  • Какой алгоритм применить, что бы передавать что одно лучше другого и в итоге получить таблицу?

    @Sumor
    Теорема о невозможности доказывает, что полностью справедливую систему построить невозможно. Нужно, учитывая предметную область, рассмотреть различные варианты обобщения коллективных оценок и выбрать наиболее удобную или подходящую.
    Неплохая статья на хабре с некоторыми способами ранжирования.
    Ответ написан
    1 комментарий
  • Что не так с наследованием интерфейсов?

    @Sumor
    Вы не указали, что Lol реализует интерфейс IParent
    public class Lol : IChild, IParent
    А также, вероятно, вы хотели в IChild добавить свойство Family

    После обновления кода:
    Вы используете явную реализацию интерфейса, но у IChild нет собственного свойства Family, только наследуемое от IParent. Как раз можно изучить ключевое слово new у свойств.
    Возможно то что вы хотите посмотреть делается так:
    using System;
    
    
    public class Test
    {
    	public static void Main()
    	{
    		Lol l = new Lol();
    		Console.WriteLine(((IParent)l).Family);
    		Console.WriteLine(((IChild)l).Family);
    		Console.WriteLine(l.Name);
    		Console.ReadLine ();
    	}
    }
    
    public class IParent
    {
    	public string Family { get { return "suck"; } }
    }
    
    public class IChild : IParent
    {
    	public string Family { get { return "duck"; } }
    
    }
    
    public class Lol : IChild
    {	
    	public string Name { get { return "ross"; } }
    }
    // Вывод:
    // suck
    // duck
    // ross
    Ответ написан
    Комментировать
  • Работа с *.txt с нескольких приложений одновременно?

    @Sumor
    Для одновременной работы с файлом несколькими приложениями его нужно открывать во всех приложениях со специальным указанием: FileShare.ReadWrite
    FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

    В этом случае все приложения смогут одновременно читать и писать в файл. Это накладывает определённые ограничения на приложения - они должны как-то договариваться и понимать куда они могут писать, а куда - нет.
    Каждая программа должна писать только изменения в файл, а не переписывать его - иначе другие программы отвалятся.
    Это большой геморрой. Так делать не надо.
    Если вы всё-таки решитесь, то нужно файл разбить на блоки. Перед записью в блок программа будет его помечать, что-бы другие программы ждали, пока вы закончите с ним работать, после записи - сбрасывать пометку. Если данные удалились - нужна пометка, что блок удалён, так как нельзя сдвигать файл - его могут читать другие программы. Если данные увеличились в размере - ставить отметку удаления и записывать новые данные в конец. И тд, и тп.
    Большая часть из этого заложено, например, в формат dbf. Но реализовывать всё это придётся руками.
    Кроме того остаётся вопрос с синхронизацией изменений. Если вы в одной программе поменяли список - как об этом узнает программа на другом компьютере. Это может быть слежение за временем изменения файла, или за специальными отметками в файле ... Постоянные проблемы с синхронизацией, постоянное состояние гонки, взаимоблокировки и т.д. В общем, так делать не надо.
    Конечно, если каждой запущенной программе отводится только одна строчка и другие её не трогают, то можно попробовать изменять только её.

    Если у вас, в основном, чтения и иногда "точечные" изменения, то можно предложить следующий вариант:
    при записи: ожидать завершение всех чтений, а затем блокировать файл с FileShare.None, изменить и отпустить.
    при чтении: ожидать завершение записи, если она есть, затем открытие файла с FileShare.Read (это не блокирует другие чтения), быстрое чтение и закрытие файла.
    Под ожиданием я понимаю попытку открытия файла с соответствующими параметрами, и в случае исключения повтор через таймаут.
    Ответ написан
    Комментировать
  • Как выбрать элемент в comboBox по имени?

    @Sumor
    Items используется для "поэлементной" работы, а ItemsSource для подключения коллекций. Нельзя работать с ними одновременно - либо Items, либо ItemsSource.
    Поэтому ваш код должен преобразиться примерно в такой:
    comboBox2.SelectedIndex = (comboBox2.ItemsSource as System.Data.DataView).IndexOf("Вася");

    Но это не будет работать, так как в качестве элементов в ComboBox располагаются элементы из таблицы целиком, а не только имена. Поэтому лучше и удобнее пользоваться свойством SelectedItem, примерно так:
    comboBox2.SelectedItem = (comboBox2.ItemsSource as System.Data.DataView).Find("Вася");

    А ещё лучше через Binding связать свойство comboBox2.SelectedItem с каким-либо свойством вашей модели и использовать её.
    Ответ написан
    Комментировать
  • Есть ли смысл хранить байт в поле varchar(max) в данном случае?

    @Sumor
    varchar(max) блобовский тип. В SQLServer он хранится в отдельном от основной записи месте и не включается в ограничение 8kb на запись. По памяти занимает 2 байта + размер хранимого значения. Лучше, кстати, хранить в nvarchar, так как всё-таки уже век юникода.
    Если у вас данные до 4000 символов, лучше хранить в nvarchar(4000) - данных хранятся вместе с ключом.

    Пока у вас нет миллионов записей и нет жёстких ограничений на размер БД не усложняйте и храните так, как удобно программно обрабатывать.
    Ответ написан
    Комментировать
  • Вопрос знатокам SQL. Как исправить нехватку полученных данных (постранично) из-за дублирования при использовании JOIN?

    @Sumor
    Делаете сначала SELECT DISTINCT i.id всего вашего запроса без ORDER BY и LIMIT.
    А затем на основе полученных id формируете выдачу, например (но не обязательно только так), через WHERE i.id IN (вложенный SELECT с выбором id) уже с учётом ORDER BY и LIMIT.
    Ответ написан
    Комментировать
  • Стоит ли разнести данные в БД: на пользователя своя схема?

    @Sumor
    Работает - не трогай.
    А по сути, вопрос в том, что вас не устраивает в текущем хранении и насколько связаны данные разных пользователей.
    Если данные пользователей тесно переплетены, то есть Products, Items связаны с несколькими пользователями одновременно, но может нет смысла так заморачиваться.
    Если же данные пользователей наоборот разделены, то вы можете рассмотреть вопрос о создании под каждого пользователя своей БД. При заведении пользователя она будет создаваться, при удалении - удаляться, сохранение/восстановление/права - всё будет.
    Если хотите поиграться схемами, то лучше использовать не таблицы, а представления. На каждого пользователя создать представления в своей схеме с отбором только его записей и выставлением прав.
    Ответ написан
    Комментировать
  • Как заставить приложение принимать-отправлять данные в com портом в ардуино?

    @Sumor
    Порт закрыт - данных нет. когда порт открыт данные накапливаются в приёмном буфере, пока вы их не прочитаете через Read или ReadLine.
    Жалко нет вариантов вашего чтения, толку было бы больше.
    Ну и самая вероятная причина: вы читаете из Windows методом ReadLine, который ждёт окончание строки в виде 0x0d0a, а пишите arduino, который скорее всего посылает один символ 0x0d.
    Ответ написан
    6 комментариев
  • Как загрузить папку по FTP C#?

    @Sumor
    Ну собственно MSDN объясняет всё в лучшем виде:
    https://msdn.microsoft.com/ru-RU/library/ms229718(...
    Создаёте объект с путём до объекта с которым вы хотите что-то сделать. Т.е. если вы хотите добавить папку в этом пути должно быть имя новой папки; если загрузить файл, то имя нового файла и т.д.
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
    указываете пользователя и пароль в Credentials
    request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");

    указываете что вы хотите сделать через WebRequestMethods.Ftp
    request.Method = WebRequestMethods.Ftp.MakeDirectory;

    Указываете необходимые дополнительные параметры запроса, по необходимости. И делаете запрос
    FtpWebResponse response = (FtpWebResponse) request.GetResponse();

    В зависимости от того, что вы хотели от сервера - разбираете ответ. Подробнее - в справке по каждому методу.
    Ответ написан
  • Как отловить нажатие Alt+Shift вне моего приложения (глобально)?

    @Sumor
    Вне вашего приложения - есть системный индикатор, который можно таскать куда угодно. Хотите сделать такой-же - изучайте хуки.
    В вашем приложении вы можете получать текущую раскладку при получении фокуса на ваши окна и выставлять свой индикатор в нужное положение. Для отлова смены раскладки при вашем активном окне - обрабатывайте получение события WM_INPUTLANGCHANGE.
    Ответ написан
    3 комментария
  • Возможно ли функциональное программирование в C# без LINQ?

    @Sumor
    Хотите функциональное программирование на C# - попробуйте F#.
    Ответ написан
    Комментировать
  • Чтение из StandardOutput запущенного Process, возникает ошибка?

    @Sumor
    RedirectStandardOutput вы переопределили, а RedirectStandardInput нет. поэтому у процесса нет открытого потока для чтения. Укажите RedirectStandardInput = true при создании процесса.
    Ответ написан
    1 комментарий
  • Часто ли .net программисты сталкиваются в работе с с++?

    @Sumor
    При программировании на C# программирование C++ не нужно. Но часть примеров, особенно если сталкиваешься с чистым WinApi, или с COM (DCOM), или работой с необычными устройствами, написана на C++. Поэтому есть необходимость уметь читать и понимать примеры на C++. А иногда на VB или даже на Delphi.
    Ответ написан
    Комментировать
  • Как открыть файл при перетаскивание в окно?

    @Sumor
    Простой способ: Для формы разрешите AllowDrop и ловите событие DragDrop. В её параметрах будет описание того, что на вас кидают.

    Сложный способ: для затравки прочитайте вот это https://habrahabr.ru/post/179131/.
    Там описана реализация на Delphi, но последовательность действий такая же.
    Нужно описать все функции, которые используются через DllImport. Вызвать DragAcceptFiles.
    Переопределить Wndproc для формы protected override void WndProc(ref Message m), и там обрабатывать событие WM_DROPFILES и через DragQueryFile получить переданный список.
    Ответ написан
    Комментировать
  • Где в Windows Forms подключаться к базе данных?

    @Sumor
    Мне кажется вопрос оптимизации подключения для приложения с одним полем и кнопкой добавить не самый актуальный, но:
    Время создания и закрытия соединения с базой данных определяется вашими условиями. Если соединение с базой данных жизненно необходимо программе, и она сразу же грузит из неё данные и продолжает взаимодействовать всё время своего запуска, то в этом случае соединение создают и хранят до завершения программы.
    Для некоторых программ, которые точечно взаимодействуют с базой данных, а также если между взаимодействиями возможно отключение БД или доступа к ней по сети, соединения создаются в момент обращения к БД и после работы соединение закрывают. Это как раз очень похоже на ваш случай. При этом можно учитывать, что в действительности физические соединения к базе данных не всегда сразу закрываются при закрытии DbConnection, а придерживаются на случай, если тут же понадобится его открыть.
    С другой стороны, возможно сам факт ошибки соединения с БД уже сообщит пользователю о проблемах и ему не придётся узнавать это после заполнения многостраничной формы ввода. В этом случае желательно проверить соединение до ввода пользователя.
    Ответ написан
    1 комментарий
  • Как проверить в данной задаче можно ли делить чисто на 3 последнюю цифру?

    @Sumor
    Формулировка задания, я бы сказал очень неточная, но отвечаю так как я её понял.
    "Нужно найти разбиение стоимости на пяти- и трёхкопеечные монеты без остатка"
    Для стоимости более 15 копеек такое разбиение всегда можно найти. Для цены до 15 копеек возможность разбиения находится перебором.
    Для определения минимального количества трёхкопеечных монет смотрим на остаток деления на 5:
    остаток 0 - 0 (или 5) трёхкопеечных монет
    остаток 1 - 2 трёхкопеечных монеты
    остаток 2 - 4 трёхкопеечные монеты
    остаток 3 - 1 трёхкопеечная монета
    остаток 4 - 3 трёхкопеечные монеты
    Количество пятикопеечных монет считаем исходя из количества трёхкопеечных.

    NB: трёхкопеечные, а также пятикопеечные монеты пишутся вместе. Если вы пишите количество монет и не хотите склонять их названия, пишите количество после наименования: трёхкопеечных монет - 5.
    Ответ написан
    Комментировать
  • Как запустить WPF приложение из консоли?

    @Sumor
    using System;
    
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Starting WpfApplication1.exe...");
    
            var domain = AppDomain.CreateDomain("WpfApplication1Domain");
            try
            {
                domain.ExecuteAssembly("WpfApplication1.exe");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                AppDomain.Unload(domain);
            }
    
            Console.WriteLine("WpfApplication1.exe exited, exiting now.");
        }
    }
    Ответ написан
    2 комментария