Update danych w bazieC

0

Co w tym kodzie jest nie tak że po wywołaniu nie dokonuje Update'u

string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\ewidencja.mdb";
            OleDbConnection conn = new OleDbConnection(connString);
            string query = "UPDATE wyrobiska SET wyrobisko = @wyrobisko, wydobywcza = @zw, niewydobywcza =@znw, status = @status WHERE (id = @ID)";
            OleDbCommand cmd = new OleDbCommand(query, conn);
            cmd.Parameters.Add("@ID", OleDbType.Integer).Value = ID;
            cmd.Parameters.Add("@wyrobisko", OleDbType.LongVarChar).Value = this.textBox1.Text.Trim();
            cmd.Parameters.Add("@zw", OleDbType.Integer).Value = Convert.ToInt16(this.textBox2.Text.Trim());
            cmd.Parameters.Add("@znw", OleDbType.Integer).Value = Convert.ToInt16(this.textBox3.Text.Trim());
            if (statusCH.Checked)
                cmd.Parameters.Add("@status", OleDbType.Char).Value = 'w';
            if (!statusCH.Checked)
                cmd.Parameters.Add("@status", OleDbType.Char).Value = 'a';

            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }

id jest pobierane z DataGridView

this.ID = Convert.ToInt32(wyrGV.Rows[r].Cells[0].Value);

Nie działa również:

           cmd.ExecuteReader();
0

a debuggera znasz?
rzuca jakis exception?
jesli nie to moze rekord o podawanym id nie istenieje, zobacz debuggerem jakia wartosc ma parametr @id

ten kod jest zly
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
jelsi wystapi blad w query, polaczenie nie zostanie zamkniete, powinno byc:

Connection conn = null;
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Excetion ex)
{
// blok catch jesli chcesz cos zrobic tutaj z exceptionem
}
finally
{
if (conn != null) conn.Close();
}

0
  • Nie rzuca błędów w ogóle.
  • id musi być poprawne bo w ten sam sposób realizuję DELETE.
  • co do wyjątku to mało istotne w tej chwili.
  • umiejętność debuggera - średnio niski - początkujący
0

w kodzie szary (moze jestem daltonista, kolor=Control :D) pasek z lewej, klikasz na niego aby ustawic breakpoint (pulapka po naszemu tlumaczona)
odpalasz program w trybie debug F5 i podgladasz zmienne

0
  • poziom średnio-niski, ale wartość potrafię sprawdzić,
  • zastanawia mnie dlaczego konstrukcja zapytania którą stosuję działa z INSERT i z DELETE, a UPDATE nie chce się ruszyć,
  • Gdzie się włącza numerowanie linii to tak OT?
0
trzcionek napisał(a)
  • Gdzie się włącza numerowanie linii to tak OT?

Tools -> Options -> TextEditor -> C# checkbox Line numbers

0
trzcionek napisał(a)
  • poziom średnio-niski, ale wartość potrafię sprawdzić,
  • zastanawia mnie dlaczego konstrukcja zapytania którą stosuję działa z INSERT i z DELETE, a UPDATE nie chce się ruszyć

czyli rozumiem ze wszystkie parametry zapytania maja poprawne, oczekiwane przez ciebie wartosci?

zapytanie wyglada poprawnie, wiec, jesli mozesz proponuje przelaczyc sie na sql serwer, poniewaz do niego mozna podpiac sie profilerem, ktorym mozna podgloadac zapytania lecace
jesli masz wersje sql express, to nie ma w toolsach microsoftowego profilera, ale jest fajny projekcik nazwany Sql srv profiler express, do sciagniecia tu: http://sites.google.com/site/sqlprofiler/

0

Wartości są OK,
Zaczynałem to pisać na SQL Server i tam chyba działało (sprawdzę) , ale wymagania się zmieniły.
Sprawdzę a jakieś alternatywne rozwiązanie dokonania UPDATE'u? Opcja DELETE + INSERT nie wchodzi w grę ;)

//EDIT
Odgrzebałem wcześniejszą wersję i taki sposób UPDATE'u z MS SQL SERVER działało.

0

a ExecuteNonQuery ile zwraca? (zwraca liczbe zmowyfikowanych wierszy)

a jestes pewien ze wiersz o @ID istenieje w bazie?
sprobuj wykonac z reki takiego update, z wartosciami jakie podstawiaja sie do query

0

Sprawdziłem:

  • ExecuteNonQuery() - 0 (zero) zmodyfikowanych wierszy;
  • ID jestem pewny jest OK;
  • Ręcznie wpisane i przesłane zapytanie działa;
  • Po zmodyfikowaniu zapytania do takiej postaci:
            string query = "UPDATE wyrobiska SET wyrobisko = 'XXXX', wydobywcza = 10, niewydobywcza =10, status = 'a' WHERE (id = @id)";

Rekord zostaje zmodyfikowany.

  • Jeśli próbuję przesłać coś przez parametr tzn. np. ... wyrobisko = @wyrobisko... to nie ma zostaje zmodyfikowany żaden rekord.

Np. takie coś działa:

string query = @"UPDATE wyrobiska SET wyrobisko = '" + this.textBox1.Text.Trim() + "', wydobywcza = " + this.textBox2.Text.Trim() + ", niewydobywcza = " + this.textBox3.Text.Trim() + ", status = 'a' WHERE (id = @id)";

To rozwiązuje problem ale jest mało czytelne i nieestetyczne. :/

0

Spróbuj tak:

            if (statusCH.Checked)
                cmd.Parameters.Add("@status", OleDbType.Char).Value = "w";
            if (!statusCH.Checked)
                cmd.Parameters.Add("@status", OleDbType.Char).Value = "a";
0

Nie sposób podania znaku nie ma wpływu.
W zapytaniu tylko ID jest przechwycone, reszta parametrów nie jest brana pod uwagę.

////EDIT:
Najdziwniejsze jest to że z SQL SERVER działało bez problemu.

//// EDIT2:
Przerobiłem query na typowego stringa - tymczasowo.
Problem jednak pozostaje nie rozwiązany.

0

Próbowałeś ustawiać wartości tylko niektórych parametrów? Najlepiej po kolei, najpierw tylko wyrobisko, potem zw, itd.

Możesz podejrzeć w debbugerze cmd.CommandText i cmd.Parameters w linii z cmd.ExecuteNonQuery(); ?

0
somekind napisał(a)

Próbowałeś ustawiać wartości tylko niektórych parametrów? Najlepiej po kolei, najpierw tylko wyrobisko, potem zw, itd.

Tak próbowałem tylko wartość ID daje radę z warunku WHERE

somekind napisał(a)

Możesz podejrzeć w debbugerze cmd.CommandText i cmd.Parameters w linii z cmd.ExecuteNonQuery(); ?

Możesz napisać najlepiej przykładem (jestem początkujący) o co dokładnie chodzi i jak to zrobić.

  • W linii cmd.ExecuteNonQuery()
    w polu CommandText jest:
    "UPDATE wyrobiska SET wyrobisko = @wyrobisko, wydobywcza = @wydobywcza, niewydobywcza = @niewydobywcza, status = @status WHERE (id = @ID)"
    w polu Parametrs - > Count jest 5
    Jak pisałem już wcześniej ExecuteNonQuery() zwraca 0 wierszy;
0

No o to mi chodziło. :)
A kliknij w tego plusika przy Parameters, to będziesz miał dostęp do nich po kolei, powinny tam być pokazane ich wartości (ew. gdy znowu rozwiniesz plusika). Zobacz czy wszystkie są wstawione takie, jakie chciałeś.

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