Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Подскажите студенту насчет DB.


Автор: shark1 6.12.2007, 18:46
Подскажите как такое исполнить.Есть table в Access,в ней всего несколько полей для отображения наличия деталей на складе.Вопрос как так закрутить чтоб было видно сколько получено было деталей,сколько есть на данный момент и сколько использовано.Все это пытаюсь сделать на C#.Зарание огромное спасибо.

Автор: 1stain 6.12.2007, 19:26
структуру таблицы, как я понимаю ты объяснишь по телепатическому каналу связи?

Автор: shark1 8.12.2007, 16:51
Извени 1stain ,таблица такая Id,специальный номер детали,кол.полученых деталей,дата получения,сколько затраченно деталей,сколько осталось деталей.Вроде так,Спасибо.

Автор: 1stain 8.12.2007, 20:46
не понял, в чем проблема. Вроде вся нужная информация лежит в таблице в готовом виде (что по-моему для таблицы довольно-таки странно) - бери и вытаскивай SELECT * FROM ...

Автор: unicuum 9.12.2007, 02:40
В Access делаешь такую таблицу

Таблица tblDetails (детали):
поле                описание
  • idDetail            ID
  • fldName             Название
  • fldSpecialNumber    Специальный номер
  • fldReceptionDate    Дата получения
  • fldReceived         Получено
  • fldSpent            Затрачено
  • fldRemained         Осталось

Потом соединяешься с этой базой заливаешь в DataGridView и всё. Ну а что тут ещё сказать smile 

P.S.
Вообще-то говоря поле fldRemained осталось вычисляемым и его вводить в таблицу не нужно, потому я пометил его серебряным, а для вычисления выражений есть как минимум два пути.
1. Взять выражение в запросе.
2. Вычислить его в отсоединённом объекте

Первый способ плох тем что запрос каждый раз придётся заново делать, так как изменение полей ничего не даёт. Ну для второго нужно делать отсоединённые объекты, но если данные отображаются в DataGrid или DataGridView, то они уже по существу есть.

Заюзать второй способ можно использовав свойство столбца:
Namespace: System.Data
Assembly: System.Data (in system.data.dll)
DataColumn.Expression Property

Локальная ссылка в MSDN 2003
ms-help://MS.VSCC.2003/MS.MSDNQTR.2004JUL.1033/cpref/html/frlrfsystemdatadatacolumnclassexpressiontopic.htm

Локальная ссылка в MSDN 2005
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref4/html/P_System_Data_DataColumn_Expression.htm

Ну, а примеры там и так простые, нужно из одного столбца вычесть другой, что и прописать в выражении "Received - Spent", именно столбца. Тогда когда ячейки со значениями будут меняться, выражение будет для этих рядов пересчитываться.

А вообще, так сразу трудно догадаться, что челам нужно на этом форуме. Пишут что попало, нет сразу сказать, что нужно автоматически вычислять выражение.

P.S. после P.S. Телепат моё второе имя smile 

Автор: shark1 9.12.2007, 20:21
Спасибо unicuum,вот тут что то застрял.На этом отрезке :
Код

this.adapter1.InsertCommand.CommandText = string.Format(
                    "INSERT INTO [Storage] ( Name, Item_number_details,[ReceptionDate],Received) " +
                    "VALUES ( '{0}','{1}', '{2}', '{3}');",
                    txt_Name.Text,
                    txt_Item_num_det.Text,
                    txt_ReceptionDate.Text,
                    txt_Received.Text            
    
выдает такую Exception:
System.NullReferenceException was unhandled
  Message="Object reference not set to an instance of an object."
где сделал ошыбку подскажите.Зарание спасибо.

Автор: shark1 9.12.2007, 20:58
Спасибо с этим разобрался,Теперь подскажите вот что,на форме есть пару кнопок:
1)Add in Db;
2)View DB;
соответственно в обработчике одной заношу данные в базу,а во второй показываю в дата гриде.Почемуто когда я показываю данные все отображается как надо,но при этом при попытке сохранить что то в базе выдает ошибку,а если не показываю а только сохроняю то все работает отлично.Подскажите в чем ошибочка.Зарание спасибо.
Код

private void btn_Add_in_Db_Click(object sender, EventArgs e)
        {
            
            try
            {
                oleDbConnection1 = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\FEEDER.mdb");
                
                //open the bridge between the application and the datasource
                this.oleDbConnection1.Open();

                this.oleDbDataAdapter2.InsertCommand.CommandText = string.Format(
                    "INSERT INTO [Storage] ( Name, Item_number_details,ReceptionDate,Received) " +
                    "VALUES ( '{0}','{1}', '{2}', '{3}');",
                    txt_Name.Text,
                    txt_Item_num_det.Text,
                    txt_ReceptionDate.Text,
                    txt_Received.Text                

                    );

                this.oleDbDataAdapter2.InsertCommand.Connection = oleDbConnection1;

                //execute the qurey 
                this.oleDbDataAdapter2.InsertCommand.ExecuteNonQuery();

                //close the connection
                this.oleDbConnection1.Close();

                MessageBox.Show("Record inserted Successfully", " Warning !!! ",
                MessageBoxButtons.OK, MessageBoxIcon.Information); //inform the user

                //clear the form 
                this.txt_Name.Text = "";
                this.txt_Item_num_det.Text = "";
                this.txt_ReceptionDate.Text = "";
                this.txt_Received.Text = "";
                
                this.txt_Name.Focus();

                //show the qurey
                //this.qurey_label.Text = "";
                //this.qurey_label.Text = oleDbDataAdapter1.InsertCommand.CommandText.ToString();

            }
            catch (System.Data.OleDb.OleDbException exp)
            {
                //close the connection
                this.oleDbConnection1.Close();

                MessageBox.Show(exp.ToString());
            }
        }
Код

private void btn_View_DB_Click(object sender, EventArgs e)
        {
            //CalcColumns();
            oleDbConnection1 = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\FEEDER.mdb");
            // Создаем адаптер
            oleDbDataAdapter2 = new OleDbDataAdapter("SELECT * FROM Storage", oleDbConnection1);

            // Создаем таблицу db
            table1 = new System.Data.DataTable("Storage");
            table1.Columns.Add("idDetail", typeof(string));
            table1.Columns.Add("Name", typeof(string));
            table1.Columns.Add("Item_number_details", typeof(string));
            table1.Columns.Add("ReceptionDate", typeof(string));
            table1.Columns.Add("Received", typeof(string));
            table1.Columns.Add("Spent", typeof(string));
            table1.Columns.Add("Remained", typeof(string));

            
            oleDbDataAdapter2.Fill(table1);




            dataGrid1.DataSource = table1;
            this.oleDbConnection1.Close();
        }



Автор: unicuum 10.12.2007, 00:54
Смотря на твой код хочется его перечеркнуть smile Я же говорил уже на форуме, что мой опыт программирования достаточно скромен, но вот это просто ужасно smile 

Начнём с того, что всё делается не правильно, в БД не нужно изобретать велосипед, нужно пользоваться зарекомендовавшими себя способами.

1. Не правильно пользуется try. (Close стоит не там где ему положено быть, не правильно поставлен отлов исключений)
2. Не правильно задаются параметры. (откровенно говоря они вообще не задаются, а идёт попытка создать запрос на основе сложения строк, это в корне не верно для присоединённых объектов, а для отсоединённых вообще не приемлимо)

Прежде чем двигаться дальше прочти вот эту тему http://forum.vingrad.ru/forum/s/8b7620724f89919feb7cd444fc8cd80b/topic-183692/kw-access-insert-update.html, недавно обсуждали как вставлять строки присоединённым способом.

Сначала мы перетёрли код на VB.NET, когда строки добавляются присоединённым способом, а под конец thomas дал код на C#, но уже для отсоединённых объектов. Впрочем таких примеров в MSDN миллион и три тележки.

Ну так вот, если тебе надо просто добавлять строчки, то можно делать это присоединённым способом, но не так как у тебя, а используя параметры. Сразу предупреждаю, то как сделалано у тебя, вообще не приемлимо, это издевательство над наукой. smile 

Я думаю с присоединённым способом тебе не составит труда разобраться прочитая топик про добавление строк, но если у тебя используется DataColumn.Expression, то тут однозначно нужен отсоединённый способ, с его традиционным вызовом методов DataAdapter'а Fill и Update. Ознакомится с ним можно в том же топике.

Вердикт таков, твой код не нужно исправлять, его нужно полностью переписывать, потому что он сплошная ошибка. Исправить я его к сожалению не могу, так как надо всё переделывать заново. smile 

Мои рекомендации таковы, выкачай из интернета книгу "Дэвид Сеппа -  Microsoft ADO.NET", оттуда же можно выкачать и примеры. Хотя книг по .NET базам данных много, это я считаю наиболее простая и между тем позволяющая изучить многие тонкости ADO.NET.

Автор: shark1 11.12.2007, 10:47
Спасибо огромное за замечания,буду исправлятся,и учится делать как надо.Но честно сказать весь этот код отлично работает я его немного подправил и без проблем.Ну да ладно век живи век учись.Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)