Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Solnake
Полностью с тобой согласен! поэтому я также как и ты советую Lihonosov почитать книгу про реляционные БД - в таких книгах как раз все подводные камни и описаны!

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 10:52 10-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запутался.
Есть три таблицы: Группы поставщиков, Валюты, Имя поставщика.
Есть форма на ней два TextBox и два ComboBox, а также DataGridView.
Два ComboBox связаны каждая со своей таблицей (это "справочники" 1 - валюта, 2 - имя поставщика). DataGridView связана со своей таблицей (Группы поставщиков), в которой всего четыре столбца и два из них это значения: Валюта и Имя поставщика (эти два ComboBox). Остальные два TextBox это значения из DataGridView (соответственно, кот. остались: Имя группы и Коэффициент).
DataGridView используется только для отображения и перемещения по записям, у нее ReadOnly=true.
С занесением всех значений и отображением разобрался (т.е. если в DataGridView переходить по строчкам, то значения меняются и в TextBox и в ComboBox).  
C редактированием также все получилось (только со значениями из ComboBox немного повозился, поставил обработчик на DataItemChanged по результату которого значения которые выбраны в ComboBox сразу обновляются в DataGridView, а также поставил обработчик на DataGridView, чтобы если сменялась текущая строка, то в ComboBox значения также менялись).
А вот с добавлением и удалением...
Таблицы связаны ключами, т.е. в таблице "Группы поставщиков" два значения связаны как один ко многим. Одно с таблицей "Валюты" (руб., $...), а другое с "Имя поставщика".
Посоветуете, что-нибудь и вообще я на правильном пути???
 
Добавлено:
Читать то я читаю, как только есть время.
 
Добавлено:
Группы поставщиков - PRIMARY KEY --> [Группы поставщиков].[Имя группы]
Валюты - PRIMARY KEY  -->  Валюты.Валюта
Имя поставщика - PRIMARY KEY   --> [Имя поставщика].Имя
 
[Группы поставщиков].Валюта - Внешний ключ ---> Валюты.Валюта
[Группы поставщиков].[Имя поставщика] - Внешний ключ ---> [Имя поставщика].Имя
 
Так у меня отношения стоят в самой базе. В DataSet также поставил Relations.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 11:31 10-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
1. по поводу связей возможно я что-то недопонял, но я бы зделал связи такие:  
Валюта.Код - >  Имя_поставщика.Валюта
Группа_поставщиков.Код - > Имя_Поставщика.Группа
2. Добавление записи в гриде:
На событие "добавление" вешаеш обработку, которая собирает необходимые данные для параметров запроса (ну обычно введенная строка) и передаеш их. В самом запросе добавления сначала проверяеш наличие переданных значений справочников Валюта и Группа поставщика через обычный Select. Если все значения имеются в  справочниках добавляеш полученные параметры в таблицу Имя постащика.

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 13:34 10-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Валюта.Код - >  Имя_поставщика.Валюта
Группа_поставщиков.Код - > Имя_Поставщика.Группа  

В таблице "Группа поставщиков" есть четыре поля:
Например:
 
      Группа             Имя пост.               Валюта прайса            Коэффициент
Канцелярия          ЧП Канцопт                   грн.                              1,2
Промтовары           ООО "ОГО"                   $                                  1,15
...

Цитата:
В самом запросе добавления сначала проверяеш наличие переданных значений справочников Валюта и Группа поставщика через обычный Select. Если все значения имеются в  справочниках добавляеш полученные параметры в таблицу Имя постащика.

Проверять ненужно, т.к. это значения из ComboBox, которые пользователь выбирает, а не вводит. А нужно проверить "Группа" и "Коэффициент"
 
 
Добавлено:
Я пробовал так:
На "ДОБАВИТЬ" я вставляю строку:
sqlDataAdapter1.InsertCommand.Parameters["@Группа"].Value="NEW";
sqlDataAdapter1.InsertCommand.Parameters["@Коэффициент"].Value=1;
sqlDataAdapter1.InsertCommand.Parameters["@Валюта"].Value="руб.";  //валюта по умолчанию
sqlDataAdapter1.InsertCommand.Parameters["@Имя поставщика"].Value=""; //можно NULL
 
sqlConnection1.Open();
sqlDataAdapter.InsertCommand.ExecuteNonQuery();
sqlConnection1.Close();
 
DataSet1.Clear();
sqlDataAdapter.Fill(DataSet1);
(пишу по памяти, так что могут быть ошибки)
 
Но выдает ошибку, точно не помню, что в таблице не может быть два одинаковых значения в  "Группа". Но я точно знаю, что в таблице нет группы с названием "NEW"?!?!?
 
Приведенный выше код работает у меня на других таблицах, например "Валюта", "Единицы измерения"..., т.е. где только один PRIMARY KEY и нет внешних ключей.
Может есть какая-то особенность добавления строк в таблицу, которая содержит внешние ключи???

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 14:28 10-01-2008 | Исправлено: Lihonosov, 14:30 10-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
Тогда получается что связь будут такие:
Валюта.Код - > Группа_поставщика.Код_Валюты
Имя_Поставщика.Код - > Группа_поставщика.Код_постащика
Т.е. таблица "валюта" состоит например из 2 столбов: код, имя валюты.
"Имя поставщика" - код, имя поставщика
в таблице "Группа поставщиков" следующие поля: группа, код_поставщика, код_валюты и коэффициент.
 
По поводу проверок тебе по-любому нужно сначала проверить наличие в справочниках значений КОДА валюты и КОДА поставщика
 
По поводу ошибки выложи пожалуйста еще sql запрос ... по коду C# вроде в порядке ...

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 15:08 10-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Тогда получается что связь будут такие:
Валюта.Код - > Группа_поставщика.Код_Валюты
Имя_Поставщика.Код - > Группа_поставщика.Код_постащика
Т.е. таблица "валюта" состоит например из 2 столбов: код, имя валюты.
"Имя поставщика" - код, имя поставщика
в таблице "Группа поставщиков" следующие поля: группа, код_поставщика, код_валюты и коэффициент.

Абсолютно верно

Цитата:
По поводу проверок тебе по-любому нужно сначала проверить наличие в справочниках значений КОДА валюты и КОДА поставщика  

А зачем делать проверку введенных значений из ComboBox, ведь в ComboBox значения из таблиц "Валюты" и "Имя поставщика"???
Цитата:
По поводу ошибки выложи пожалуйста еще sql запрос ... по коду C# вроде в порядке ...

На форме у меня три адаптера:
1. Для DataGridView   -  SELECT * FROM [Группы поставщиков]
2. ComboBox - тот, кот. Валюта   SELECT * FROM Валюты
3. ComboBox - тот, кот. имя поставщика. SELECT * FROM [Имя поставщика]
И DataSet  в котором хранятся результаты этих запросов и установлены Relations.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 15:33 10-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
в адаптерах должны быть команды вставки, обновления и удаления данных - попробуй их настроить: есть два варианта - либо писать запрос в адаптере (минус в том если ты захочеш изменить запрос, то придеться компилировать приложение заново), либо писать в адаптере sql-процедуру (естесно изменения вносяться на sql сервере и компилировать ничего не нужно). я обычно пользуюс вторым вариантом.  
И чаще всего структуру приложения такая - есть отдельный проект, в котором храняться данные, выбираются из БД, записываются и т.д., на выходе получается .dll . а второй проект непосредственно формы, которые юзают уже .dll .

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 06:14 11-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BlackVetal
Аналогично делаю проекты.
 
Для работы с базой есть классы приблезительно такой структуры

Код:
 
public class TemplateRelationDALC: DALCBase
    {
        #region Properties
 
        private int _TVID;
        private int _TOTVID;
        private int _RID;
        private ViewRelationDALC _SelfRelations;
 
        public int TVID
        {
            get { return _TVID; }
            set { _TVID = value; }
        }
 
        public int TOTVID
        {
            get { return _TOTVID; }
            set { _TOTVID = value; }
        }
 
        public int RID
        {
            get { return _RID; }
            set { _RID = value; }
        }
 
        public ViewRelationDALC SelfRelations
        {
            get
            {
                if (_SelfRelations==null)
                {
                    _SelfRelations = ViewRelationDALC.Get(RID, Transaction);
                }
                return _SelfRelations;
            }
            set { _SelfRelations = value; }
        }
 
        #endregion
 
        #region Constructors
 
        public TemplateRelationDALC(int _TVID, int _TOTVID, int _RID, SqlTransaction p_Transaction)
            : base(p_Transaction)
        {
            this._TVID = _TVID;
            this._TOTVID = _TOTVID;
            this._RID = _RID;
        }
 
        public TemplateRelationDALC(int _TVID, int _TOTVID, int _RID)
        {
            this._TVID = _TVID;
            this._TOTVID = _TOTVID;
            this._RID = _RID;
        }
 
        #endregion
 
        public override int Save()
        {
            StProcedure.ProcedureName = "rb_TemplateRelation_Save";
            StProcedure["@ID"].Direction = ParameterDirection.InputOutput;
            StProcedure["@ID"].Value = ID;
            StProcedure["@TVID"].Value = _TVID;
            StProcedure["@TOTVID"].Value = _TOTVID;
            StProcedure["@RID"].Value = _RID;
            StProcedure.ExecuteNonQuery();
            int tmpID = (int)StProcedure["@ID"].Value;
            if (tmpID>0)
                SetID(tmpID);
            return ID;
        }
 
        #region Get
 
        public static TemplateRelationDALC Get(int id, SqlTransaction p_Transaction)
        {
            StoredProcedure sp = new StoredProcedure("rb_TemplateRelation_Select", p_Transaction);
            sp["@ID"].Value = id;
            sp["@TVID"].Value = DBNull.Value;
            sp["@TOTVID"].Value = DBNull.Value;
            DataReader dr = sp.ExecuteReader();
            try
            {
                if (dr.Read())
                {
                    TemplateRelationDALC dalc =
                        new TemplateRelationDALC(dr.GetInt32("TVID"), dr.GetInt32("TOTVID"), dr.GetInt32("RID"),
                                                 p_Transaction);
                    dalc.SetID(dr.GetInt32("TRID"));
                    return dalc;
                }
                return null;
            }
            finally
            {
                dr.Close();
            }
        }
 
        public static TemplateRelationDALC Get(int id)
        {
            return Get(id, null);
        }
 
        public static TemplateRellationCollection GetAll(int tvid, SqlTransaction p_Transaction)
        {
            StoredProcedure sp = new StoredProcedure("rb_TemplateRelation_Select", p_Transaction);
            sp["@ID"].Value = DBNull.Value;
            sp["@TVID"].Value = tvid;
            sp["@TOTVID"].Value = DBNull.Value;
            DataReader dr = sp.ExecuteReader();
            try
            {
                TemplateRellationCollection collection = new TemplateRellationCollection();
                while (dr.Read())
                {
                    TemplateRelationDALC dalc =
                        new TemplateRelationDALC(dr.GetInt32("TVID"), dr.GetInt32("TOTVID"), dr.GetInt32("RID"),
                                                 p_Transaction);
                    dalc.SetID(dr.GetInt32("TRID"));
                    collection.Add(dalc);
                }
                return collection;
            }
            finally
            {
                dr.Close();
            }  
        }
 
        #endregion
 
        public void Delete()
        {
            StProcedure.ProcedureName = "rb_TemplateRelation_Delete";
            StProcedure["@ID"].Value = ID;
            StProcedure.ExecuteNonQuery();
        }
 
    }
 

Никакого sql-текста запросов в коде, все что связано с работой с базой - все в хранимых процедурах.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 09:51 11-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BlackVetal
Solnake
Спасибо Вам.
Со вставкой и удалением разобрался.
У меня было три адаптера и один DataSet, в кот. три таблицы. Когда я вставлял строку, то после всего очищал датасет и снова заполнял, чтобы добавленная строка отобразилась в датагриде. НО! Адаптера три, а поновому заполненных датасет после добавления был заполнен от одного адаптера, а про остальные два??? Т.е. вконце процедуры добавления строки и очистки датасет, нужно было :
sqlDataAdapter1.Fill(DataSet1);
sqlDataAdapter2.Fill(DataSet1);
sqlDataAdapter3.Fill(DataSet1);
или для этих двух адаптеров создать свой датасет.
 
Добавлено:
А еще у меня на OnLoad формы стоит:
int row;
row=DataGridView1.CurrentCell.RowIndex;
ComboBox1.SelectedValue=DataSet1.[Группы поставщиков].[row].gname;
ComboBox2.SelectedValue=DataSet1.[Группы поставщиков].[row].gval;
Т.е. чтобы в комбобоксах выделялись значения, кот. в текущей строке датагрида. Такие же строки стоят на кликмыши про строке грида и на KeyUp.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 10:30 11-01-2008 | Исправлено: Lihonosov, 10:35 11-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
я чесно скажу уже не помню работу со стандартными компонентами ... но помоему нужно делать команду fill для Dataset, а не для адаптера ...
я уже давно работаю с компонентами из библиотеки ComponentOne - для мене это лучший вариант для работы с БД ...

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 10:44 11-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
я чесно скажу уже не помню работу со стандартными компонентами ... но помоему нужно делать команду fill для Dataset, а не для адаптера ...  

DataAdapter.Fill Method
 
Adds or refreshes rows in the DataSet to match those in the data source using the DataSet name, and creates a DataTable named "Table".
[Visual Basic]
Public MustOverride Function Fill( _
   ByVal dataSet As DataSet _
) As Integer Implements IDataAdapter.Fill
[C#]
public abstract int Fill(
 DataSet dataSet
);
[C++]
public: virtual int Fill(
 DataSet* dataSet
) = 0;
[JScript]
public abstract function Fill(
   dataSet : DataSet
) : int;
С msdn.microsoft.com

Цитата:
я уже давно работаю с компонентами из библиотеки ComponentOne - для мене это лучший вариант для работы с БД ...

Я ставил себе как-то CоmponentOne на VisualStudio 2005 и были ужастные тормоза, но это было на старом компе (Celeron 2,53, 512 ОЗУ). Сейчас работаю на компе (Core2Duo 2Ghz, 2Gb ОЗУ) и Visual Studio 2008 TeamSuite.
Как ComponentOne с VisualStudio2008?

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 10:59 11-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
1. Тебе нада эта Visual Studio 2008 TeamSuite?
Ставь себе простую студию 2005 и лучше поставь себе на нее ReSharper, пользы будет больше. Тем более что 2008 насколько я знаю делалась для 3-го фреймфорка.
2. Компоненты тормозить среду разработки не должны впринцыпе. Сам экзешник делать тяжелее могут, а как на саму студию они влияют - хз как у тебя такое получилось.
3. Я пользуюсь еще со времени писания на делфе DevExpress. Просто шас фирма не хочет покупать их под НЕТ, а буржуи не хотят чтобы им писали с украденными компонентами, то приходится рисовать кучу своих контролов. Но это под веб.
А свои проекты, что пишу дома - юзаю везде DevExpress. Грида более удобного чем у него не видел нигде.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 11:45 11-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ставь себе простую студию 2005 и лучше поставь себе на нее ReSharper, пользы будет больше. Тем более что 2008 насколько я знаю делалась для 3-го фреймфорка.  

В ней когда создаешь проект, то выбираешь какой фреймфорк хочешь использовать.
Сегодня попробую поставить ReSharper и ComponentOne на 2008.

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 11:57 11-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov
Просто к чему я клоню - к тому что
1. в 2005 баг меньше потому как она старше и много чего в ней исправляли.
2. 2008 - глюкавая и с решарпером приготовся к частым вылетам и АВ непонятно почему. На небольших проектах - может и все гуд, на больших - такое будет постоянно.
 
Но это так... совет просто. Принцыпиальной разницы нету в какой студии писать. Главное чтобы сама среда была стабильная, чем 2008 не отличается, хотя кто как хочет так и ....

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 12:31 11-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
к частым вылетам и АВ непонятно почему

АВ-?

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 13:12 11-01-2008
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Lihonosov

Цитата:
Как ComponentOne с VisualStudio2008?  

вполне нормально. тем более недавно было обновление компонент ...
 
по поводу  DataAdapter.Fill Method - прошу прощения не прав - заработался с компонентами ComponentOne - там как раз наоборот делается Dataset.Fill
 
Solnake

Цитата:
2008 - глюкавая и с решарпером приготовся к частым вылетам и АВ непонятно почему. На небольших проектах - может и все гуд, на больших - такое будет постоянно

Чесно сказать не очень долго работаю на vs2008 в паре с TFS2008... Проект не скажу что совсем большой ( командой пишем второй год ERP-систему) да и на маленький уже давно не тянет. Пока глюкоф не замечено ...

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 13:36 11-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
АВ-?

Access Violation
А может и другая ошибка, не помню точно, но от этого не легче, вылеты есть.

Цитата:
Пока глюкоф не замечено ...

У нас один проект где только файлов работы с БД - 500 штук. Я уже молчу о контролах, веб-формах и т.д.
При чем все написано по всем канонам ООП.
Так вот, в 2008 пробовал работать, и вернулся назад на 2005.

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 14:14 11-01-2008 | Исправлено: Solnake, 13:51 12-01-2008
Lihonosov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А есть информация по использованию ComponentOne?

Всего записей: 537 | Зарегистр. 05-07-2007 | Отправлено: 16:17 11-01-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Solnake

Цитата:
Так вот, в 2008 пробовал работать, и вернулся назад на 2007.

Странно. У меня ситуация полностью противоположная. Перенес проект с 2003 на 2005 - матерился чуть не каждый день, глюк на глюке и глюком погоняет. Выход 2005 SP1 ситуацию практически не улучшил (что они там патчили на 400Мб и почти час установки?). Переехал на 2008 где-то в октябре - претензий нет.
 
Добавлено:
Lihonosov
Ну там же хелп есть наверняка

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 12:30 12-01-2008
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Хм...
Ну прям так у всех работает нормально, а у меня нет... Заставило задуматся....
Качаю Microsoft Visual Studio 2008 Team Suite ENU, буду еще раз пробовать. Возможно и придется поменять свое мнение...

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 14:06 12-01-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru