Access+DataSet+пустая таблица с полями аналогичными полям БД

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Access+DataSet+пустая таблица с полями аналогичными полям БД

Сообщение Thomas » 14.11.2006 (Вт) 16:16

Приветствую.
В учебном проекте имитируем продажу товара клиенту.
При загрузке формы соединяюсь с БД и создаю в DataSet таблицу продажи (она пуста) с полями аналогичными полям истинной таблицы в БД. Для этого выполняю sql-Запрос к таблице в БД с условием, которое ложно. (клиента с таким кодом заведомо нет)
Код: Выделить всё
con = new OleDbConnection(constr);
cmd = new OleDbCommand();
cmd.Connection = con;
da = new OleDbDataAdapter(cmd);
ds = new DataSet();

cmd.CommandText = "select [code artikel], [code klant],[datum verkoop], " +
                  "[aantal verkochte exemplaren], [verkoopprijs], " +
                  "[code betaling] " +
                  "from tblVerkopen where [code klant]=99-9999";
da.Fill(ds, "verkoop");

При запросе перечисляю все поля таблицы в БД. Таблица с "шапкой" нормально создается в DataSet и при работе программы нормально заполняется выбранными товарами и их количеством. После окончания продажи выбранному клиенту, произвожу UpDate БД, т.е. в реальную таблицу в БД добавляю строки из таблицы в DataSet, потом для нового клиента таблицу очищаю от строк ("шапка "остается).
Все хорошо.

Но надо еще обновить данные в таблице товаров в БД. Уменьшить "Сток" (voorraad) на количество проданных экземпляров.

Решил пойти проторенным путем, создать при загрузке формы еще одну таблицу, в которой хранить код товара и сток. Снова sql-запрос с ложным условием и ... ни фига. :( Сообщение об ошибке:"Отсутствует значение для одного или нескольких требуемых параметров."

Код: Выделить всё
da = new OleDbDataAdapter(cmd);
            //cmd.CommandText = "select [code artikel], Voorraad from " +
            //                  "[tblArtikels_(verkoop)] where [code artikel]= VK-10000";
           
            cmd.CommandText = "SELECT [Code artikel], Categorie, [Leveranciersreferentie artikel], " +
                  "[Code leverancier], [Naam artikel], [Beschrijving artikel], " +
                  "[Aankoopprijs artikel], [Verkoopprijs artikel], [BTW-code artikel]," +
                  " Voorraad, [Minimale voorraad], [Datum eerste aankoop], [Aantal maanden garantie] " +
                  "FROM [tblArtikels_(verkoop)] " +
                  "WHERE [Code artikel]=VK-10000";
            da.Fill(ds, "AantalVerkocht");

Первоначально пробовал создать таблицу на два требуемых поля, чтобы не грузить память лишней информацией. Потом со всеми полями.
Результат тот же.

В чём может быть проблема :?: Какой параметр я упустил :?: Поля исходной таблицы перечислены полностью и правильно.

Для чего нужна эта таблица? Я буду заность туда код товара и кол-во проданных экземпляров. Потом вносить эти изменения в таблицу БД.

Вроде бы все логично. :?: Или можно как-то по другому, более изящно, проще.
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 15.11.2006 (Ср) 16:55

всё сделал :D
Код: Выделить всё
# region UpDate DataBase met gegevens van verkoop en voorraad van artikelen aanpassen
        private void btnVerkocht_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Verkoop voor klant ==> " + label1.Text.ToUpper());
            //voorraad van artikelen aanpassen in tblArtikels_(verkoop)
            VoorradAanpassen(ds.Tables["verkoop"]);
            int nr = 0;
            OleDbCommand cmd = new OleDbCommand(); cmd.Connection = con;
            try
            {
                con.Open();
                MessageBox.Show("Tabel tblVerkopen moet UpDate worden met nieuwe verkoop." +
                                " Connection is " + con.State.ToString());
                foreach (DataRow dr in ds.Tables["verkoop"].Rows)
                {
                     sql = "INSERT INTO tblVerkopen (" +
                           "[code artikel], [code klant],[datum verkoop]," +
                           "[aantal verkochte exemplaren], [verkoopprijs]," +
                           "[code betaling])" +
                           "VALUES (" +
                           "'" + dr[0] + "', " +
                           "'" + dr[1] + "', " +
                           "'" + dr[2] + "', " +
                           dr[3] + "," + dr[4] +
                           ",'" + dr[5] +  "')";
                     cmd.CommandText = sql;
                     nr += cmd.ExecuteNonQuery();
                }
                ds.AcceptChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fout bij UpDate DB: " + ex.Message);
            }
            finally
            {
                label6.Text = nr.ToString();
                ds.Tables.Remove("verkoop");
                con.Close();
                MessageBox.Show("Tabel tblVerkopen was UpDate. Tabel verkoop in DS is removed." +
                                " Connection is " + con.State.ToString());
            }


            label1.Text = ""; label6.Text = ""; label7.Text=""; textBox1.Text = ""; textBox1.Focus();
            dataGridView1.DataSource = null;
            MaakTabel();
            i = 0;

        }

        private void VoorradAanpassen(DataTable dt)
        {
            int was, nu, ver,r;
            int nrr = 0;
            string aCode;

            con.Open();
            MessageBox.Show("voorraad van artikelen moet aangepaast worden, connection is " + con.State.ToString(), "voorraad aanpassen");
            try
            {
                r = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    aCode = dr[0].ToString();
                    ver = Convert.ToInt32(dr[3]);
                    was=Convert.ToInt32(ds.Tables["artikel"].Rows[r++][3]);
                    nu = was - ver;
                    sql = "UPDATE [tblArtikels_(verkoop)]" +
                          " SET voorraad = " + nu +     //nieuwe waarde
                          " WHERE voorraad = " + was + //oude waarde
                          " AND [code artikel] = " + "'" + aCode + "'";
                    cmd.CommandText = sql;
                    nrr += cmd.ExecuteNonQuery();
                }
                ds.AcceptChanges();
                MessageBox.Show("Voorraad van artikelen is aangepaast voor zoveel artikelen: " + nrr.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fout bij voorraad van artikelen aan te passen: " + ex.Message, "voorraad aanpassen");
            }
            finally
            {
                con.Close();
                MessageBox.Show("voorraad is aangepaast, connection is " + con.State.ToString(), "voorraad aanpassen");
            }
        }
    # endregion


Eerst drinken,
dan denken,
en DAN WERKEN! :lol:

любите пиво, источник знаний. Ramzes :wink:
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList