Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Базы данных под .NET > Класс описывающий промежуточную таблицу |
Автор: thomas 19.12.2007, 00:16 | ||
Приветствую всех. Предположим имеется БД с тремя таблицами: поставщики, товары и поставщики-товары. Так как поставщик может поставлять различные товары и товар может поставляться различными поставщиками имеет место быть промежуточная таблица. Поставщики кодПоставщика РК название адрес ... Товары кодТовара РК название цена ... Поставщики-Товары кодПоставщика РК FK кодТовара РК FK кодТовара_У_Поставщика описаниеТовара_У_Поставщика ... Каждую строку(record) в таблице описывает класс. Таблица в целом - List<Record> Для сохранения данных в БД в классе написано два приватных метода: первый для insert, второй для update. А какой из них выполнять определяет публичный метод класса
Как видно из кода, если запись существует(имеет id) то вызывается метод update, если записи еще нет то вызывается метод add. А теперь собственно вопрос. Как мне реализовать публичный метод для составного ключа в таблице. Ведь я по любому имею id товара и id поставщика. Но в одном случае мне нужно добавить строку в таблицу БД, а во втором, например, изменить описание товара у поставщика. По какому условию вызывать тот или иной метод? Что-то я ни как не соображу. ![]() Заранее спасибо. Добавлено через 5 минут и 12 секунд Да, спросите почему метод SaveEntity один? Потому как он вызывается при нажатии кнопки "save" в BindingNavigator на форме. Поэтому нужно реализовать логику выбора в одном методе, а не "разделять" кнопку навигатора на две. ![]() |
Автор: thomas 19.12.2007, 10:38 |
tol05, Привет. Классы описывающие поставщика и товар содержат методы SaveEntity() для них самих. Повторюсь. Соответственно этот метод, в каждом классе, определяет сохранять строку(новую) в таблицу или же внести изменения в нее(существующую строку). В данном случае логика проста, если есть такая строка, то в классе её описывающем свойство id >0. А теперь мне надо вносить или изменять строку в промежуточную таблицу. У меня есть id поставщика, у меня есть id товара от этого поставщика и код этого товара, присвоенный поставщиком, может присутствовать описание от поставщика на данный товар. Надо определить вносить новую запись в таблицу или изменять существующую. Перебирать все строки промежуточной таблицы на наличие комбинации id+id как-то не кошерно. Ладно будем думать. Удачи тебе. ![]() А я пока на работу. ![]() |
Автор: D_F_V 19.12.2007, 11:14 | ||
Если есть промежуточный DataTable то можно так...
думаю мысль понятна... ![]() |
Автор: tol05 19.12.2007, 11:36 | ||
Так... теперь понятно. Сделай в базе хранимую процедуру, внутри примерно такой код
ну и вызывай ее в Поставщики-Товары.SaveEntity() ... Если вернется что-то, то значит делаешь Update(), иначе - Add() |
Автор: thomas 19.12.2007, 14:39 |
tol05, Так-с идея понятна. Завтра после работы попробую. Сегодня вечером сдавать экзамен. А пока снова на работу. Обеденный перерыв такой короткий, блин. Ох уж это "буржуинство". ![]() Добавлено через 47 секунд D_F_V, Спасибо за участие. ![]() |
Автор: mr.DUDA 19.12.2007, 15:16 | ||
Можно для ускорения проверять только кол-во записей:
Выполнять запрос через dbCommand.ExecuteScalar, в результате будет кол-во строк. |
Автор: tol05 19.12.2007, 15:23 |
да, но если [кодПоставщика] + [кодТовара] = Primary Key (т.е. должны быть уникальны), то тогда всегда будет только одна строка с таким [кодПоставщика] и таким [кодТовара]. К тому же, если такая строка есть, то ее нужно апдейтать, а значит, лучше сразу ее же и вернуть из процедуры. Но я в БД ... не очень ... поэтому на своем варианте не настаиваю. ![]() |
Автор: mr.DUDA 19.12.2007, 15:53 |
1 поставщик продал только 1 товар, и всё? ![]() В primary key таблицы Поставщики-Товары не хватает третьей колонки. Типа собственный ID-шник. И можно назвать таблицу "продажи" чтобы было понятно ![]() Всё ИМХО. Кстати, это называется "отношение многие-ко-многим". |
Автор: thomas 19.12.2007, 18:51 | ||
mr.DUDA, Приветствую. ![]() Давно не было. Как жизнь?
Что бы мне было понятно таблица называется tblLeveranciersArtikelen. И к продажам она никакого отношения не имеет. ![]() Потому как часто возникает необходимость найти в базе данные на товар не по своему коду, а именно по коду поставщика. А за count спасибо. Используя count в хранимой процедуре, при ее выполнении получу либо НОЛЬ либо ЕДИНИЦУ. То что доктор прописал. ![]() С наилучшими ![]() |
Автор: tol05 19.12.2007, 19:03 |
ну значит я не понял вопроса. Что ж, буду отвечать только на те вопросы, которые смог понять. |
Автор: thomas 19.12.2007, 19:17 |
tol05, Ты все нормально понял. Поставщик может продать один товар и все, а может и много. mr.DUDA просто развил , по моему, твою идею до логического завершения. Спасиб. Всем привет, побежал сдавать экзамен. ![]() |
Автор: mr.DUDA 19.12.2007, 19:41 | ||
Ok, это я не так понял ![]() З.Ы. жизнь налаживается, на форуме буду появляться почаще. |