Niepoprawne aktualizowanie bazy Oracle

0

Mam problem. Próbuje zrobić UPDATE ale cały czas mam coś nie tak. Mógłby ktoś spojrzeć i podpowiedzieć jak zmienić to co do tej pory napisałem?

Najpierw zrobiłem coś takiego:

string sql = string.Format("update baza set MIEJSCOWOŚĆ = {0}, ULICA = {1}, NUMER = {2}, POCZTA = {3} WHERE MIEJSCOWOŚĆ = {4} and ULICA = {5} and NUMER = {6} and POCZTA = {7}", "textBox1_Miejscowość.Text, textBox2_Ulica.Text, textBox3_Numer.Text, textBox4_Poczta.Text, ___form.label1_Miejscowość.Text, ___form.label2_Ulica.Text, ___form.label3_Numer.Text, ___form.label4_Poczta.Text");

Potem wyczytałem że lepiej stworzyć sobie parametry:

        private void button1_Dodaj_Click(object sender, EventArgs e)
        {
            using (OracleConnection conn = new OracleConnection("User ID=BAZA;Password=MojeHaslo;"))
            {
                using (OracleCommand cmd = new OracleCommand())
                {

                    string sql = string.Format("UPDATE BAZA SET MIEJSCOWOŚĆ = NewMIEJSCOWOSC, ULICA = NewULICA, NUMER = NewNUMER, POCZTA = NewPOCZTA WHERE  MIEJSCOWOŚĆ = OldMIEJSCOWOSC and ULICA = OldULICA and NUMER = OldNUMER and POCZTA = OldPOCZTA");
                    cmd.CommandText = sql;
                    cmd.Connection = conn;
                    cmd.Parameters.Add("NewMIEJSCOWOSC", textBox1_Miejscowość.Text);
                    cmd.Parameters.Add("NewULICA", textBox2_Ulica.Text);
                    cmd.Parameters.Add("NewNUMER", textBox3_Numer.Text);
                    cmd.Parameters.Add("NewPOCZTA", textBox4_Poczta.Text);
                    cmd.Parameters.Add("OldMIEJSCOWOSC", ___form.label1_Miejscowość.Text);
                    cmd.Parameters.Add("OldULICA", ___form.label2_Ulica.Text);
                    cmd.Parameters.Add("OldNUMER", ___form.label3_Numer.Text);
                    cmd.Parameters.Add("OldPOCZTA", ___form.label4_Poczta.Text);

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


            }
        }

Może ktoś wie jak to przebudować? Coś dodać, coś usunąć, może powinno to wyglądać inaczej? Dodam że argument Poczta czasami jest pusty. Chciałem żeby ta wartość nie była obowiązkowa w bazie. Może to jest źródłem problemu?

0

Co to za błąd?

Patrz jak się używa parametrów w oracle http://www.devart.com/dotconnect/oracle/articles/parameters.html

0

277eca429cd4e.jpg

1

Ja mam takie coś z jakiegoś starego projektu, ale działa. Może spróbuj sobie przerobić.

 
        public int UpdatePlace(Place p, decimal oldId)
        {
            String update = @"UPDATE MIEJSCA
                          SET IDMIEJSCA = :p_id, 
                          ULICA= :p_ulica, 
                          MIASTO = :p_miasto, 
                          KOD = :p_kod,
                          TELEFON = :p_telefon 
                          WHERE IDMIEJSCA = " + oldId;
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                try
                {
                    connection.Open();

                    OracleCommand cmd = connection.CreateCommand();
                    cmd = new OracleCommand(update, connection);
                    cmd.CommandType = CommandType.Text;


                    OracleParameter p_id = new OracleParameter("p_id", OracleDbType.Decimal, ParameterDirection.Input);
                    p_id.Value = p.IdPlace;
                    cmd.Parameters.Add(p_id);

                    OracleParameter p_ulica = new OracleParameter("p_ulica", OracleDbType.NVarchar2, ParameterDirection.Input);
                    p_ulica.Value = p.Street;
                    cmd.Parameters.Add(p_ulica);

                    OracleParameter p_miasto = new OracleParameter("p_miasto", OracleDbType.NVarchar2, ParameterDirection.Input);
                    p_miasto.Value = p.City;
                    cmd.Parameters.Add(p_miasto);

                    OracleParameter p_kod = new OracleParameter("p_kod", OracleDbType.NVarchar2, ParameterDirection.Input);
                    p_kod.Value = p.ZipCode;
                    cmd.Parameters.Add(p_kod);

                    OracleParameter p_telefon = new OracleParameter("p_telefon", OracleDbType.NVarchar2, ParameterDirection.Input);
                    p_telefon.Value = p.CellPhone;
                    cmd.Parameters.Add(p_telefon);


                    using (var transaction = connection.BeginTransaction())
                    {
                        try
                        {
                            cmd.Transaction = transaction;
                            int success = cmd.ExecuteNonQuery();
                            transaction.Commit();
                            return success;
                        }
                        catch (Exception)
                        {
                            transaction.Rollback();
                            throw;
                        }
                    }
                    //MessageBox.Show("Updated");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Błąd: " + ex);
                    return 0;
                }
            }
        }
2

Co prawda nie testowałem i nie wiem jakiego provider używasz ale to powinno zadziałać:

cmd.CommandText = "UPDATE BAZA SET MIEJSCOWOŚĆ = :NewMIEJSCOWOSC, " +
                           "ULICA = :NewULICA, " +
                           "NUMER = :NewNUMER, " +
                           "POCZTA = :NewPOCZTA " +
                           "WHERE  MIEJSCOWOŚĆ = :OldMIEJSCOWOSC " +
                           "and ULICA = :OldULICA " +
                           "and NUMER = :OldNUMER " +
                           "and POCZTA = :OldPOCZTA";
         cmd.Connection = conn;
         cmd.Parameters.Add("NewMIEJSCOWOSC", textBox1_Miejscowość.Text);
         cmd.Parameters.Add("NewULICA", textBox2_Ulica.Text);
         cmd.Parameters.Add("NewNUMER", textBox3_Numer.Text);
         cmd.Parameters.Add("NewPOCZTA", textBox4_Poczta.Text);
         cmd.Parameters.Add("OldMIEJSCOWOSC", ___form.label1_Miejscowość.Text);
         cmd.Parameters.Add("OldULICA", ___form.label2_Ulica.Text);
         cmd.Parameters.Add("OldNUMER", ___form.label3_Numer.Text);
         cmd.Parameters.Add("OldPOCZTA", ___form.label4_Poczta.Text);

         conn.Open();
         var affectedRows = cmd.ExecuteNonQuery();
         conn.Close();

         string query = cmd.CommandText;
         foreach (var p in cmd.Parameters)
         {
            query = query.Replace(p.ParameterName, p.Value.ToString());
         }
         Debug.WriteLine("Moje Query: " + query);
         Debug.WriteLine("Zmodyfikowane rekordy: " + affectedRows);
         // Klasa Debug jest w 
         // using System.Diagnostics;

Edit:
Zmodyfikowałem lekko kod podmień u siebie i powiedź co tam dostajesz pod zmienna query i affectedRows. Albo za pomocą debuggera albo z zakładki output w visual studio.

0
Error	1	'object' does not contain a definition for 'ParameterName' and no extension method 'ParameterName' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)	
Error	2	'object' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)	
Error	3	The name 'Debug' does not exist in the current context	
Error	4	The name 'Debug' does not exist in the current context
2

Co do 2 ostatnich błędów to musisz dopisać using System.Diagnostics co @DibbyDum napisał nawet w komentarzu.

A te dwa pierwsze błędy:
Zamień foreach (var p in cmd.Parameters) na foreach (SqlParameter p in cmd.Parameters)

Z tym że nie jestem pewny czy to się też tak nazywa w oraclu. Może być SqlOracleParameter czy coś w tym stylu.

0

Dane załadowało zarówno nowe jak i stare. Jedna Poczta jest pusta bo w tabelce też była nie wpisana. Ale modyfikacji 0...

Moje Query: UPDATE BAZA SET MIEJSCOWOŚĆ = :Kozłowo, ULICA = :Kościelna, NUMER = :111, POCZTA = :1111 WHERE  MIEJSCOWOŚĆ = :Kozłowo and ULICA = :Kościelna and NUMER = :4 and POCZTA = :
Zmodyfikowane rekordy: 0
1

Na początek sprawdź czy ten select coś zwraca:

select * from BAZA WHERE  MIEJSCOWOŚĆ = 'Kozłowo' and ULICA = 'Kościelna' and NUMER = 4 and POCZTA = ''
1

Select nic nie zwróci skoro nic nie zostało zaktualizowane poprzez Update. :)

1

I wracamy do wcześniejszej rady aby wyszukiwało po ID.

0

a jeśli z tego zapytania wykreślę pocztę to nie powinno mi po prostu wyszukać wartość po 3 elementach i zrobić update? jest możliwość pominięcia w where poczty?

edit: racja dla argumentów z poczta uzupełniona robi update

0

Powinno, ale co jeśli w przyszłości inna kolumna będzie pusta?

0

W tym rzecz ze pozostałe kolumny mają ustawione ze muszą mieć określoną wartość wiec nie będzie takiego przypadku. A po drugie nie ma możliwości by adres z tej samej miejscowości, ulicy, numeru miał dwa różne kody pocztowe więc dalej spełniałoby to swoją rolę.

0

Zamiast zrobić dobrze to kombinujesz jak tu zrobić tak aby tylko działało.

Wystarczy robiąc selecta zapisać gdzieś też ID, nie musisz tego wyświetlać.
Ale rób jak chcesz.

0

Dziękuję za wytrwałość :)

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