Usuniecie danych z Access za pomocą dropdownlist i buttonclick

0

Cześć wszystkim.
Mam problem z kodem, który mi się nie kompiluje z niewiadomego dla mnie powodu...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;
using System.Configuration;


namespace WebApplication5
{
    public partial class _Default : System.Web.UI.Page
    {
        public string GetConnectionString()
        {
            return System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DeptInfo();
            }
        }

        public void DeptInfo()
        {
            // calling up your connection string that was configured  in you Web Config File
            using (OleDbConnection conn = new OleDbConnection(GetConnectionString()))
            {
                DataTable dt = new DataTable();
                //conn.Open();
                String sql = "SELECT * FROM projects";
                OleDbCommand cmd = new OleDbCommand(sql, conn);

                cmd.Connection.Open();
                cmd.ExecuteNonQuery();

                OleDbDataAdapter ad = new OleDbDataAdapter(cmd);
                ad.Fill(dt);

                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        string Cat;
                        Cat = dt.Rows[i]["nazwa_projektu"].ToString();
                        DropDownList1.Items.Add(Cat);
                    }

                }
                cmd.Connection.Close();
            }
        }

        protected void Remove_Click(object sender, EventArgs e)
        {
            ExecuteDelete(DropDownList1.SelectedItem.Text);
        }

        private void ExecuteDelete(string nazwa_projektu)
        {
            OleDbConnection conn = new OleDbConnection(GetConnectionString());
            string sql = "DELETE FROM projects WHERE nazwa_projektu=@nazwa_projektu)";
            try
            {
                conn.Open();
                OleDbCommand cmd = new OleDbCommand(sql, conn);

                OleDbParameter[] param = new OleDbParameter[1];

                param[0] = new OleDbParameter("@nazwa_projektu", OleDbType.VarChar, 50);

                param[0].Value = nazwa_projektu;

                for (int i = 0; i < param.Length; i++)
                {
                    cmd.Parameters.Add(param[i]);
                }

                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                string msg = "Data Cannot Be Deleted : ";
                Label1.Text = msg + ex.Message;
                throw new Exception(msg);
            }
            finally
            {
                conn.Close();
                Label1.ForeColor = System.Drawing.Color.LimeGreen;
                Label1.Text = "Record Was Successfully Deleted!";
            }

            DeptInfo();
        }

    }
}

Po wybraniu pozycji z dropdownlist i kliknieciu na Remove_click - kompilator wskazuje na cmd.ExecuteNonQuery(); w private void ExecuteDelete(string nazwa_projektu) pisząc:

System.Data.OleDb.OleDbException: „Zbędny ) w wyrażeniu kwerendy 'nazwa_projektu=@nazwa_projektu)'.”

Po usunięciu linii cmd.ExecuteNonQuery();...pozycje w dropdownlist się klonują (plik bd zostaje niezmieniony) mimo, że w założeniu wybranie pozycji z listy i zatwierdzenie przyciskiem powinno usunąć odpowiednie rekordy z bazy access

2

@Neosphoros: Tutaj nie chodzi o to co wypluł kompilator? Czyli „Zbędny ) w wyrażeniu kwerendy 'nazwa_projektu=@nazwa_projektu)'.” nawias za nazwa_projektu=@nazwa_projektu)

0

@jarzi:

Masz rację. Tylko dlaczego w chwili zaznaczenia pozycji z dropdownlist i kliknięciu na Remove_Click na liście klonują sie pozostałe pozycje do czasu restartu aplikacji (z bazy danych prawidłowo usuwana jest wybrany rekord)?

0

@Neosphoros: Sprawdź czy nie wchodzi Ci na Page_Load w warunek o !IsPostBack, ew. możesz przed

for (int i = 0; i < dt.Rows.Count; i++)
{
    string Cat;
    Cat = dt.Rows[i]["nazwa_projektu"].ToString();
    DropDownList1.Items.Add(Cat);
}

dodać

DropDownList1.Items.Clear(); 
0

@jarzi:
Chyba wchodzi... poprzez użycie DeptInfo(); w ExecuteDelete() co powoduje, że dropdownlist wczytuje sie raz z Page_load, a drugi raz z ExecuteDelete. Czy mam rację? Tylko, że wtedy, czy...

DropDownList1.Items.Clear(); 

...nie wyczyści listy nie zostawiając na niej niczego, w odróżnieniu do tego i jaki jest zamiar - usunąć z listy tylko jedną pozycję?
Można by w jakiś sposób odświeżyć dropdownlist w widoku przeglądarki po Remove_click?

0

@Neosphoros: Ale jeśli usuniesz rekord, potem się odświeża i wchodzi w DeptInfo() i czyścisz dropdownlistę to zapylasz z bazy kontrolkę, już bez tej usuniętej wartości, bo jej nie ma w bazie

0

@jarzi:

Przepraszam Cię, ale jestem początkującym w programowaniu. Nie rozumiem tego co napisałeś.

0

@Neosphoros: No dobra to zróbmy tak, napiszę Ci co teraz robi program, a Ty wskaż co tu jest nie tak
Baza danych zawiera 3 projekty - web, desktop, mobile

  1. Otwiera się strona
  2. Pobierasz projekty z bazy (masz 3 projekty)
  3. Dodajesz te projekty do DropDownList1 (web,desktop,mobile)
  4. Z DropDownList1 wybierasz projekt pierwszy czyli web
  5. Do bazy idzie DELETE, który usuwa zaznaczony projekt z bazy
  6. Odświeża się widok, pobierają się projekty z bazy (masz teraz 2 projekty)
  7. Dodajesz te projekty do DropDownList1 (w DropDownList1 masz już web, desktop, mobile więc dochodzą te dwa pobrane i masz web, desktop, mobile, desktop, mobile)
    No i coś tu nie gra, c'nie? ;)
0

@jarzi:

Do punktu 6 się zgadza, później jednak jeśli usunąłem z bazy 1 wartość to dropdownlist ma zawierać wszystkie pozycje, które zawarte były wcześniej, ale pomniejszone o tę jedną usuniętą wartość. Drop down list ma być po prostu odbiciem zawartości bazy danych. Do momentu restartu aplikacji (i po wciśnięciu przycisku usuwania) na liscie dropdown (jedynie na liście) klonują się pozostałe rekordy - co jest dla mnie niezrozumiałe i całkowicie niepotrzebne. Dopiero po restarcie - lista dropdown przyjmuje właściwe wartości czyli: wszystkie (niesklonowane) - 1 uprzednio usunięty.
Przypuszczam, że chodzi o tego "if'a":

if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        string Cat;
                        Cat = dt.Rows[i]["nazwa_projektu"].ToString();
                        DropDownList1.Items.Add(Cat);
                    }

                }

Jak go więc zmienić by miał właściwą postać? Czy jest on w ogóle potrzebny, bo mam wrażenie, że nie, czy mam rację?

0

@Neosphoros: To tak jak wcześniej pisałem przed for (int i = 0; i < dt.Rows.Count; i++) wyczyść sobie DropDownList1 i tyle

0

@jarzi:

No ale użycie DropDownList1.Items.Clear(); przed licznikiem wyczyszcza całą listę i tak ją zostawia do samego końca

0

@Neosphoros: ale w pętli for dodajesz itemy

0

@jarzi:

No Ty mi powiedz dlaczego lista jest pusta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1