Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс описывающий промежуточную таблицу, с составным ключом. 
V
    Опции темы
thomas
Дата 19.12.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Приветствую всех.
Предположим имеется БД с тремя таблицами: поставщики, товары и поставщики-товары.
Так как поставщик может поставлять различные товары и товар может поставляться различными поставщиками имеет место быть промежуточная таблица. 
Поставщики
кодПоставщика РК
название
адрес
...

Товары
кодТовара РК
название
цена
...

Поставщики-Товары
кодПоставщика РК FK
кодТовара РК FK
кодТовара_У_Поставщика
описаниеТовара_У_Поставщика
...

Каждую строку(record) в таблице описывает класс.  Таблица в целом - List<Record>
Для сохранения данных в БД в классе написано два приватных метода: первый для insert, второй для update.
А какой из них выполнять определяет публичный метод класса
Код

public static Order SaveEntity(Order order)
                {
                    if (order.OrderID > 0)
                        return UpdateEntity(order);
                    else
                        return AddEntity(order);
                }

Как видно из кода, 
если запись существует(имеет id) то вызывается метод update, 
если записи еще нет то вызывается метод add.

А теперь собственно вопрос.
Как мне реализовать публичный метод для составного ключа в таблице. Ведь я по любому имею id товара и id поставщика.
Но в одном случае мне нужно добавить строку в таблицу БД, а во втором, например, изменить описание товара у поставщика.
По какому условию вызывать тот или иной метод?
Что-то я ни как не соображу.  smile   А потому прошу совета.
Заранее спасибо.

Добавлено через 5 минут и 12 секунд
Да, спросите почему метод SaveEntity один?
Потому как он вызывается при нажатии кнопки "save" в BindingNavigator на форме.
Поэтому нужно реализовать логику выбора в одном методе, а не "разделять" кнопку навигатора на две.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
tol05
Дата 19.12.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(thomas @  18.12.2007,  23:16 Найти цитируемый пост)
Как мне реализовать публичный метод для составного ключа в таблице. Ведь я по любому имею id товара и id поставщика.
Но в одном случае мне нужно добавить строку в таблицу БД, а во втором, например, изменить описание товара у поставщика.
По какому условию вызывать тот или иной метод?


ИМХО тебе нужно:
- получить список (List<T>) всех поставщиков и проверить, содержит ли он твой кодПоставщика. Если содержит - Update(), иначе - Add()
- то же самое сделать по товарам.

Ничего военного, логика работы почти та же, что и в SaveEntity()

А еще лучше - сделать в классах поставщика и товара по методу SaveEntity, где сам поставщик (или товар) будет определять, Update() ему делать или Add(). А в "Поставщики-Товары" просто вызывай 
Код

Поставщик.SaveEntity();
Товар.SaveEntity();



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 19.12.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



tol05
Привет.
Классы описывающие поставщика и товар содержат методы SaveEntity() для них самих. Повторюсь. Соответственно этот метод, в каждом классе, определяет сохранять строку(новую) в таблицу или же внести изменения в нее(существующую строку). В данном случае логика проста, если есть такая строка, то в классе её описывающем свойство id >0.
А теперь мне надо вносить или изменять строку в промежуточную таблицу. У меня есть id поставщика, у меня есть id товара от этого поставщика и код этого товара, присвоенный поставщиком, может присутствовать описание от поставщика на данный товар. Надо определить вносить новую запись в таблицу или изменять существующую.
Перебирать все строки промежуточной таблицы на наличие комбинации id+id как-то не кошерно.
Ладно будем думать.
Удачи тебе.  smile 
А я пока на работу.  smile 
 



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
D_F_V
Дата 19.12.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.3.2007
Где: Vladivostok

Репутация: нет
Всего: 1



Если есть промежуточный DataTable то можно так...

Код

String _filter = String.Format("ID = {0}", id);
_table.Select(_filter);


думаю мысль понятна...  smile 
PM MAIL ICQ MSN   Вверх
tol05
Дата 19.12.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Так... теперь понятно. Сделай в базе хранимую процедуру, внутри примерно такой код
Код

SELECT * FROM [Поставщики-Товары] WHERE [кодПоставщика]=@кодПоставщика AND [кодТовара]=@кодТовара

ну и вызывай ее в Поставщики-Товары.SaveEntity() ... 
Если вернется что-то, то значит делаешь Update(), иначе - Add()


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 19.12.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



tol05
Так-с идея понятна. Завтра после работы попробую. Сегодня вечером сдавать экзамен.
А пока снова на работу. Обеденный перерыв такой короткий, блин. Ох уж это "буржуинство". smile

Добавлено через 47 секунд
D_F_V
Спасибо за участие.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
mr.DUDA
Дата 19.12.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Можно для ускорения проверять только кол-во записей:
Код
SELECT COUNT(*) FROM [Поставщики-Товары] WHERE [кодПоставщика]=@кодПоставщика AND [кодТовара]=@кодТовара


Выполнять запрос через dbCommand.ExecuteScalar, в результате будет кол-во строк.


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 19.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



да, но если [кодПоставщика] + [кодТовара] = Primary Key (т.е. должны быть уникальны), то тогда всегда будет только одна строка с таким [кодПоставщика] и таким [кодТовара].

К тому же, если такая строка есть, то ее нужно апдейтать, а значит, лучше сразу ее же и вернуть из процедуры.

Но я в БД ... не очень ... поэтому на своем варианте не настаиваю. smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 19.12.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



1 поставщик продал только 1 товар, и всё?  smile 

В primary key таблицы Поставщики-Товары не хватает третьей колонки. Типа собственный ID-шник. И можно назвать таблицу "продажи" чтобы было понятно smile.

Всё ИМХО. Кстати, это называется "отношение многие-ко-многим".


--------------------
user posted image
PM MAIL WWW   Вверх
thomas
Дата 19.12.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



mr.DUDA
Приветствую.  smile 
Давно не было. Как жизнь? 

Цитата

И можно назвать таблицу "продажи" чтобы было понятно

Что бы мне было понятно таблица называется tblLeveranciersArtikelen.
И к продажам она никакого отношения не имеет.  smile Основная задача этой таблицы хранить значение кода товара, который присвоил ему поставщик.
Потому как часто возникает необходимость найти в базе  данные на товар не по своему коду, а именно по коду поставщика.

А за count спасибо. Используя count в хранимой процедуре, при ее выполнении получу либо НОЛЬ либо ЕДИНИЦУ.
То что доктор прописал.    smile 

С наилучшими  smile 

Это сообщение отредактировал(а) thomas - 19.12.2007, 23:59


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
tol05
Дата 19.12.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(mr.DUDA @  19.12.2007,  14:53 Найти цитируемый пост)
  smile 

ну значит я не понял вопроса.

Что ж, буду отвечать только на те вопросы, которые смог понять.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 19.12.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



tol05
Ты все нормально понял.
Поставщик может продать один товар и все, а может и много.

mr.DUDA просто развил , по моему, твою идею до логического завершения.
Спасиб.

Всем привет, побежал сдавать экзамен.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
mr.DUDA
Дата 19.12.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(thomas @  19.12.2007,  18:51 Найти цитируемый пост)
Что бы мне было понятно таблица называется tblLeveranciersArtikelen.И к продажам она никакого отношения не имеет.

Ok, это я не так понял smile 

З.Ы. жизнь налаживается, на форуме буду появляться почаще.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.