1

(1 відповідей, залишених у C#, .NET)

Отже, тема доволі цікава, але дотепної інформації про неї обмаль.
В мене є потреба реалізувати програму "Бібліотека". Вирішив вперше, нарешті, побудувати більш-менш правильну архітектуру програми. Зупинився на патерні MVP. Із реалізацією патерну начебто все ясно, але зтикнувся з проблемою як зв'язувати між собою різні елементи цього патерну. Начитавшись ще різної інфи прийшов до висновку, що тут не обітись без IoC контейнеру та принципу DI. Тих контейнерів є багато, але я вибрав Unity, бо він таки дуже поширений судячи зі всього.
Так от, ближче до діла. Зараз у загальних деталях опишу процесс начального етапу розробки проекту.

Для початку, рівень DAL (або Model в даному патерні) реалізується EF і винесений в окрему бібліотеку. Для всіх сутностей створені репозиторії і створений клас, який повинен керувати даними і спілкуватися з презентерами:

Прихований текст
public interface ILibraryDataManager
{
    //some code...
}
 
public class LibraryDataManager:ILibraryDataManager
{
     //some code...
}

Реалізація примітивна, не варто загострювати на ній увагу ...

Далі в основному солюшні реалізую класи:
MessageService - для можливості виведення повідомлень в будь-якому місці програми

Прихований текст
interface IMessageService
{
     //some code
}
    class MessageService : IMessageService
{
     //some code
}

LoginService і MainService - реалізація логіки логіну і основних функцій програми

Прихований текст
public interface ILoginService
{
    //some code
}
class LoginService : ILoginService
{  
     private readonly IMessageService messageServise;
     private readonly ILibraryDataManager libraryDBManger;
     public LoginService(IMessageService messageServise, ILibraryDataManager libraryDataManager)
     {
          this.messageServise = messageServise;
          this.libraryDBManger = libraryDataManager;
     }
        //some code...
}
 
public interface IMainService
{
     //some code
}
class MainService : IMainService
{     
    private readonly IMessageService messageService;
    private readonly ILibraryDataManager libraryDBManger;
 
    public MainService(ILibraryDataManager libraryDataManager, IMessageService messageService)
    {
         this.libraryDBManger = libraryDataManager;
          this.messageService = messageService;
     }
        //some code...
}

Далі, відповідно, інтерфейс IView і похідні від нього інтерфейси і класи, які їх реалізують:

Прихований текст
public interface IView
{
     //some code...
}
 
public interface ILoginView: IView
{
     //some code...      
}
 
public partial class FormLogin : Form, ILoginView
{
     //some code...
}
public interface IMainView: IView
{
     //some code...
}
 
public partial class MainForm : Form, IMainView
{
     //some code...
}

Тепер реалізуємо сполучну ланку - презентерів:

Прихований текст
public interface IPresenter
{
    void Run(); // цей метод повинен запускати відповідну форму (IView), передану презентеру в конструкторі
}
 
class LoginPresenter : IPresenter
{
    private readonly ILoginView loginView;
    private readonly ILoginService loginService;
    private readonly IMessageService messageService;
 
    public LoginPresenter(ILoginView loginView, ILoginService loginService, IMessageService messageService)
    {
        this.loginView = loginView;
        this.loginService = loginService;
        this.messageService = messageService;
    }
    public void Run()
    {
        loginView.Show();
    }
    //some code...
}
 
class MainPresenter : IPresenter
{
    private readonly IMainView mainView;
    private readonly IMessageService messageService;
    private readonly IMainService mainService;
   
    public MainPresenter (IMainView mainView, IMessageService messageService, IMainService mainService)
    {
        this.mainService = mainService;
        this.mainView = mainView;
        this.messageService = messageService;
    }
 
    public void Run()
    {
        Application.Run(mainView as Form); 
    }

І тепер це все щастя потрібно зареєструвати в контейнері і спробувати запустити програму:

Прихований текст
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
 
        UnityContainer container = new UnityContainer();
        container.RegisterType<ILibraryDataManager, LibraryDataManager>()
                    .RegisterType<IMessageService, MessageService>()
                    .RegisterType<ILoginService, LoginService>()
                    .RegisterType<ILoginView, FormLogin>()
                    .RegisterType<IMainView, MainForm>();
 
        var obj = container.Resolve<MainPresenter>();
        obj.Run();
    }
}

З прочитаних статей я так зрозумів, що об'єкти презентерів реєструвати в контейнері не обов'язково, тому спробував запустити додаток таким чином. Проте до рядка obj.Run () виконання не доходить, так як під час виконання попереднього рядка

var obj = container.Resolve<MainPresenter>();

вилітає виключення з таким змістом:

Прихований текст

Microsoft.Practices.Unity.ResolutionFailedException was unhandled
HResult=-2146233088
Message=Resolution of the dependency failed, type = "Library.MainPresenter", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Library.IMainService, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was:

Resolving Library.MainPresenter,(none)
Resolving parameter "mainService" of constructor Library.MainPresenter(Library.IMainView mainView, Library.IMessageService messageService, Library.IMainService mainService)
Resolving Library.IMainService,(none)

Як я розумію виходячи з опису помилки під час створення MainPresenter і передачі до нього параметрів UnityContainer намагається створити об'єкт інтерфейсу, що, ясна річ, неможливо. Але я ж додав перед цим зв'язки "Інтерфейс - Клас" в контейнер і, так розумію, Unity повинен створити відповідний об'єкт і потім передати интерфейсне посилання на нього, а виходить зовсім не те.

Загалом, тема, як скрізь пишуть, популярна, а толкової інформації немає. На простеньких примірчиках начебто все більш-менш ясно, а коли справа доходить до власної реалізації, то починається ... *WALL*

Знаю, форум цей не дуже жвавий, але може хтось є тямущий по цій темі...

2

(17 відповідей, залишених у Бази даних)

Ага, все, виявив проблему. Виявляється інсталятор нового SQL Server просто хотів замінити той фал ліцензії, але не міг того зробити навіть із відкритими правами доступу до папки Program Files... Я видалив файл вручну і інсталляція почалась без нарікань. Сподіваюсь завершиться без подальших траблів.

3

(17 відповідей, залишених у Бази даних)

Перевірив, все відкривається

4

(17 відповідей, залишених у Бази даних)

З чого ви взяли що шлях правильний? Ви це візуально бачите?

http://replace.org.ua/misc.php?action=pun_attachment&amp;item=809&amp;download=0&amp;secure_str=4251t4613

5

(17 відповідей, залишених у Бази даних)

ktretyak написав:

Ви спробуйте скопіювати той шлях, який вам вказує інсталятор, та відкрити його через Win+R.

Може ви візуально не помічаєте якогось "зайвого" символу

Ні, шлях там правильний. І файл той я можу відкрити вордом без проблем...

Може ще треба взяти до уваги той факт, що перед установкою MS SQL Server була встановлена Visual Studio 13 із інтегрованим SQL Server Express Edition. Я не знаю, може вони якось конфліктують... Хоча пробував тип інсталяції "з нуля" і "Оновлення версії" - результат один і той же.

6

(17 відповідей, залишених у Бази даних)

0xDADA11C7 написав:

З адмінськими правами запускаєте інсталятор?

Так, на це теж звернув увагу, не допомогло :/

7

(17 відповідей, залишених у Бази даних)

Друзі, таке питання. Зараз намагаюся встановити MS SQL Server 2012 на Win 8.1 x64. Після встановлення всіх налаштувань, коли починається саме інсталляція відкривається messagebox із такою помилкою:

http://i.imgur.com/dvY5Cim.png?1

І я нічого не можу зрозуміти. Переглянув шлях до того файлу, все вірно, він там є. Я вже навіть відкрив повний доступ до Program Files, але все одно одна і та ж помилка. До цього стояла Windows 7 x86 і я ставив на неї відповідний сервер, то все ставало пречудово без помилок і проблем, а тут на рівному місці :/

8

(13 відповідей, залишених у Бази даних)

ktretyak написав:

Та думаю, що ТЗ геть розмите і автор теми досить слабо розуміє що саме йому потрібно.

Bartash написав:

1. Який рушій бази? У SQL Server є функція PATINDEX(), яка шукає по шаблону. Для інших рушіїв - гугліть.
2. LIKE вам тут не допоможе, якщо слова - не константні рядки.
3. Можна ще рахувати кількість пробілів (чи чим вони у вас розділяються, ті слова) у рядку.

Все я прекрасно розумію і досить чітко поставив завдання. Якби були якісь ще додаткові умови, я б їх обов'язково вказав. Конкретно завдання таке: створити запит на вибірку назв підручників, в назві видавництва якого рівно 3 слова. Все. Там невеличка учбова база з тими книжками. Навчання йде на базі MS SQL Server. Ніяких функцій ще не вивчали і в умові такого немає, тому я і запитав про шаблони LIKE.
До речі запропонований користувачем P.Y. варіант

... LIKE '% % %' AND NOT ... LIKE '% % % %'

дуже добре працює, за що я йому і дякую.
Вибачаюсь, що раніше не відповів, бо не мав можливості.

9

(13 відповідей, залишених у Бази даних)

P.Y. написав:

А LIKE це точно зможе? Думаю, тут без регулярних виразів не обійтися (RLIKE в MySQL, наприклад).

Просто це завдання до уроку, в якому про регулярні вирази і натяку не було, а були звичайні оператори "BETWEEN, LIKE, IN".

10

(13 відповідей, залишених у Бази даних)

Дуже просте питання, до вирішення якого не можу прийти :/ Який шаблон треба задати оператору LIKE щоб він вибрав стрічки, які мають 3 слова. Не більше, не менше. Я розумію як вибрати стрічки, які мають більше слів аніж 3 (4, 5, 6... не суттєво)

... LIKE '% % %'

Але як зробити шаблон для поставленої задачі щось не можу ніяк придумати :(

11

(4 відповідей, залишених у Бази даних)

Bartash написав:

1. Покажіть структуру бази.

База типу "Магазин". Товари, виробники, постачальники, адреси і т. д. Дані повинні нести якийсь сенс, тому циклом її заповнювати мабуть тяжко. Хоча може і можливо, але я не знаю як, бо SQL тільки почали вивчати і про те як циклами заповнювати базу нічого не знаєм. Тому і заповнюєм руками. Там десь 20-30 різноманітних записів буде достатньо, щоб перевіряти як працюють запити.

Ось струтура бази:

http://firepic.org/thumbs/2014-12/25/7q9jf9k7c6gp.jpg

12

(4 відповідей, залишених у Бази даних)

Bartash написав:

Можна пошукати у графічному інтерфейсі Management Studio (якщо у вас сервер 2005+), там є можливості створення таблиць графічно, мо, й знайдете. Тільки кепський з вас вийде програмер, якщо не відвикнете від гуї-конструктора та інших плюшок на користь SQL.

Так я не кажу про створення таблиць. Я кажу про їх заповнення. Таблиці вже створені і зв'язані і навіть трохи заповнені ще Аксесом. Ми зараз почали писати запити на вибірку із нашої бази. Але ж щоб звідти вибирати, треба там щось мати. І заповнювати ті зовнішні ключи, кожен раз передивляючись зв'язану таблицю не дуже зручна справа.

13

(4 відповідей, залишених у Бази даних)

Почали вивчати СУБД. Створили невеличку структуру бази даних в Access, але тепер перейшли на MS SQL Server 2014. Переніс свою базу, створену в Access, в MS SQL Server. Виникло одне питання. В Access була дуже зручна штукенція - тип стовпчика "Поле подстановок", за допомогою якого можна було визначати зовнішні ключи однієї таблиці по випадаючому списку назв із зв'язаної таблиці і не треба відкривати кожну таблицю і дивитися ідентифікатори, які треба вставляти в поле зовнішнього ключа таблиці, яка заповнюється.

Так ось в MS SQL Server такого типу поля немає, але я знаю, що якось можна зробити це "поле підстановки", тільки якоїсь дотепної інформації як це зробити знайти не вдалося :/

14

(5 відповідей, залишених у C++)

Із записом та зчитуванням із файлу розібрався. Підкажіть тепер як можна організувати вивід цього вектору структур у вікно у вигляді списку і щоб кожен запис був інтерактивний? Тобто своєрідна база даних. Якими хоч функціями користуватись?

15

(5 відповідей, залишених у C++)

koala написав:

Крім того, sizeof( wchar_t ) != 1, але це призвело б до сміття в файлі, а не пустого.
Покажіть, що там навколо збереження файла відбувається.

Мені тут підказали, що взагалі без різниці чим заповнена структура і її записувати треба за допомогою звичайного потоку:

std::ofstream file(path, std::ofstream::binary);
file.write((char*)&list[0], sizeof(Person)*list.size())
file.close();

А я спочатку помилково думав, що якщо структура заповнена unicode стрічками, то і потік для запису в файл треба обирати відоповідний. І дуже помилявся.

16

(5 відповідей, залишених у C++)

koala написав:

Другий спосіб можете одразу викинути, list - не масив, а вектор, тобто за адресою &list можна знайти хіба що посилання на реальний масив (хоча деякі компілятори і визначають std::vector::operator& як посилання на вміст, розраховувати на це не варто).
І спробуйте записувати sizeof(Person) байтів за раз.
Хоча схоже, що проблема деінде.

sizeof(Person) байтів теж пробував, результат той же. Шлях до файлу вибирається через діалогове вікно відкриття файлів:

BOOL OpenFileDlg(HWND hWnd, LPWSTR buf, INT id)
{
    OPENFILENAME ofn = { sizeof(OPENFILENAME) };
    ofn.hInstance = GetModuleHandle(NULL);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFilter = L"All Files\0*.*\0Текстовые файлы\0*.txt\0\0";
    ofn.nFilterIndex = 2;
    ofn.lpstrDefExt = L".txt";
    ofn.nMaxFile = _MAX_PATH;
    ofn.lpstrFile = buf;
    switch (id)
    {
    case ID_FILE_SAVE :
        ofn.lpstrTitle = L"Сохранить файл";
        ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR |
            OFN_NOREADONLYRETURN | OFN_OVERWRITEPROMPT;
        if (GetSaveFileName(&ofn))
                return TRUE;
            return FALSE;
    case ID_FILE_OPEN :    
        ofn.lpstrTitle = L"Открыть файл";
        ofn.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_READONLY | OFN_SHOWHELP;
        if (GetOpenFileName(&ofn))
                return TRUE;
            return FALSE;
    default:
        break;
    }    
}

Я вже грішу може на кривий набір флагів на відкриття файлу для збереження, але так дивлюся, нічого зайвого начебто нема   %)

17

(5 відповідей, залишених у C++)

Добрий вечір. В мене, на мій погляд, просте завдання, але я не можу його подолати :/

Є звичайна структура:

struct Person
{
    wchar_t name [50];
    wchar_t surname [50];
    wchar_t patronymic[50];
    wchar_t homePhone[20];
    wchar_t mobilePhone[20];
    wchar_t birthDay[50];
    wchar_t town[50];
    wchar_t adress[100];
    wchar_t note[300];
};

Є масив цих структур, який заповнюється користувачем:

std::vector<Person> list;

У векторі структури заповнюються коректно, питань нема. Завдання полягає в тому, щоб записати цей масив структур в файл. Я йду таким шляхом:
Варіант перший за допомогою циклу:

  std::wfstream file(path, std::ios::binary | std::ios::out);
        for (int i = 0; i < list.size(); i++)
    {
        file.write((wchar_t*)&list[i], sizeof(list[i]));
    }
  file.close();

Варіант другий - спроба записати цілим шматком:

  file.write((wchar_t*)&list, sizeof(Person)*list.size());

І на виході в обох випадках отримую абсолютно пустий файл. Підкажіть шо не так, бо вже замучився шукати помилку

18

(5 відповідей, залишених у Розваги та гумор)

цікаво - додавати кнопки можна, а видалити потім ніяк. Якось нелогічно :/

19

(434 відповідей, залишених у Розваги та гумор)

Десь разів 7 переглядав це "творіння". Кожен раз плакав  :D
https://www.youtube.com/watch?v=Dd--LSD3su8

20

(3 відповідей, залишених у C++)

Дуже просте питання. В описі класу string не знайшов конструктора, який би створював стрічку із заданою довжиною. Задати довжину можна потім за допомогою методу resize(), але для цього треба писати 2 інструкції замість одної:

     string s;
     s.resize (20);

Підкажіть, може я щось десь пропустив і таки можна задати довжину стрічки під час її створення, як звичайний символьний массив наприклад:   
     

 char s [20];

Дивно, що ніде не знайшов подібної інфи  *DONT_KNOW*