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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите студенту насчет DB. 
:(
    Опции темы
shark1
Дата 6.12.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите как такое исполнить.Есть table в Access,в ней всего несколько полей для отображения наличия деталей на складе.Вопрос как так закрутить чтоб было видно сколько получено было деталей,сколько есть на данный момент и сколько использовано.Все это пытаюсь сделать на C#.Зарание огромное спасибо.
PM MAIL   Вверх
1stain
Дата 6.12.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 40



структуру таблицы, как я понимаю ты объяснишь по телепатическому каналу связи?


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
shark1
Дата 8.12.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Извени 1stain ,таблица такая Id,специальный номер детали,кол.полученых деталей,дата получения,сколько затраченно деталей,сколько осталось деталей.Вроде так,Спасибо.
PM MAIL   Вверх
1stain
Дата 8.12.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 40



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


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
unicuum
  Дата 9.12.2007, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В 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 

Это сообщение отредактировал(а) unicuum - 9.12.2007, 03:20


--------------------
user posted image
обычный день на винграде
PM   Вверх
shark1
Дата 9.12.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо 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."
где сделал ошыбку подскажите.Зарание спасибо.
PM MAIL   Вверх
shark1
Дата 9.12.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо с этим разобрался,Теперь подскажите вот что,на форме есть пару кнопок:
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();
        }



PM MAIL   Вверх
unicuum
Дата 10.12.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

Прежде чем двигаться дальше прочти вот эту тему  Вставка большого обьема данных в БД Access, порядка 30-40 тысяч строк А здесь смотрели?, недавно обсуждали как вставлять строки присоединённым способом.

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

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

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

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

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


--------------------
user posted image
обычный день на винграде
PM   Вверх
shark1
Дата 11.12.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо огромное за замечания,буду исправлятся,и учится делать как надо.Но честно сказать весь этот код отлично работает я его немного подправил и без проблем.Ну да ладно век живи век учись.Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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