Hej
Mam założoną bazę Oracle i tabele w niej, którą ładuje w datagridview. Chciałbym zrobić coś takiego, że po kliknięciu podwójnym w dany wiersz otwiera mi się nowe okno z textboxami uzupełnionymi tak jak ten wiersz. Wtedy zmieniam to co mnie interesuje i zapisuje zmianę. Może mi ktoś podpowiedzieć jak to powinno wyglądać? Może jakiś przykładowy kod? Dopiero się uczę i łatwiej mi jest na przykładzie.
Tworzysz okno z tekstboxami, pobierasz dane z zaznaczonego rekordu, wypełniasz tekstboxy i wyświetlasz okno, zapisujesz zmiany do bazy i w programie.
Będziesz miał konkretny problem i nie znajdziesz rozwiązania w google, dopiero zapytaj.
Czy tu jest wszystko ok? bo nie wiem czy poprawnie napisałem formę UPDATE? może powinno być coś więcej?
private void button1_Dodaj_Click(object sender, EventArgs e)
{
Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MojeHaslo;");
Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();
conn.Open();
cmd = new Oracle.ManagedDataAccess.Client.OracleCommand(" UPDATE INTO BAZA SET MIEJSCOWOŚĆ='" + textBox1_Miejscowość.Text + "', ULICA='" + textBox2_Ulica.Text + "', NUMER='" + textBox3_Numer.Text + "' WHERE MIEJSCOWOŚĆ='" + ___form.label1_Miejscowość.Text +"', ULICA='" +___form.label2_Ulica.Text +"', NUMER='" + ___form.label3_Numer.Text + "'", conn);
}
Lepiej by było wyszukiwać rekord po ID
Ok wskazówka na przyszłość ale co z tym. Tu jest coś źle? Czegoś brakuje? Program nie widzi żadnego erroru ale zmiany nie zapisują się.
Bo nie wykonałeś tego. Dodaj
cmd.ExecuteNonQuery();
conn.Close()
No i w ogóle to powinno być w bloku try catch.
Kumam. Będę w domu to od razu sprawdzę. Dzięki
ORA-00903: invalid table name
No i co to znaczy?
Jak nie wiemy to wpisujemy w translator.
Tak poprawiłem całość ale dalej coś mam nie tak.
private void button1_Dodaj_Click(object sender, EventArgs e)
{
Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MojeHaslo;");
Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();
try
{
conn.Open();
cmd = new Oracle.ManagedDataAccess.Client.OracleCommand(" UPDATE INTO BAZA SET MIEJSCOWOŚĆ='" + textBox1_Miejscowość.Text + "' , ULICA='" + textBox2_Ulica.Text + "' , NUMER='" + textBox3_Numer.Text + "' WHERE MIEJSCOWOŚĆ='" + ___form.label1_Miejscowość.Text + "' , ULICA='" + ___form.label2_Ulica.Text + "' , NUMER='" + ___form.label3_Numer.Text + "'", conn);
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Coś nie tak czyli co?
wpisuje wartości w okienka i pokazuje się ten komunikat
ORA-00903: invalid table name
Zastanów się powoli co on może oznaczać, to nie jest trudne.
Tabela nazywa się BAZA, serwer tez nazwałem BAZA. Niepotrzebnie zdublowałem nazwę. To musi być problem z tym początkiem?
(" UPDATE INTO BAZA_ADRESOWA SET MIEJSCOWOŚĆ='" + tex......
Problem masz z nazwą tabeli.
Nie wiem jak to jest w oraclu ale wejdź do jakiegoś managera i wygeneruj sobie to zapytanie.
W SQL Server Management Studio mogę kliknąć PPM na Nazwę tabeli -> Script Table As -> Insert To -> New Table Window i od razu mam pełną nazwę typu INSERT INTO [Sample].[dbo].[Department]
A to nie robisz wcześniej jakiegoś selecta żeby pobrać tabelę do DataGridView? Jeśli tak to weź nazwę tabeli z tamtego zapytania.
Wszędzie korzystam z takiej nazwy. Mam dodawanie elementu, usuwanie i wszędzie działa a tu dalej coś mu nie pasuje.
Pokaż jak wygląda działający select czy tam coś innego na tej tabelce.
Wróć.
To jest
insert into nazwaTabeli
i
update nazwaTabeli
Wywal to into
Dodawanie na przykład wygląda tak i działa
private void button1_Dodaj_Click(object sender, EventArgs e)
{
Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MojeHaslo;");
Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();
try
{
conn.Open();
cmd = new Oracle.ManagedDataAccess.Client.OracleCommand(" INSERT INTO BAZA VALUES('" + textBox1_Miejscowość.Text + "','" + textBox2_Ulica.Text + "','" + textBox3_Numer.Text + "')", conn);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
jak wywalam INTO to wyskakuje
ora-00933 sql command not properly ended
into
wywalasz w update mam nadzieje?
private void button1_Dodaj_Click(object sender, EventArgs e)
{
Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MojeHasło;");
Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();
try
{
conn.Open();
cmd = new Oracle.ManagedDataAccess.Client.OracleCommand(" UPDATE BAZA SET MIEJSCOWOŚĆ='" + textBox1_Miejscowość.Text + "', ULICA='" + textBox2_Ulica.Text + "', NUMER='" + textBox3_Numer.Text + "' WHERE MIEJSCOWOŚĆ='" + ___form.label1_Miejscowość.Text + "', ULICA='" + ___form.label2_Ulica.Text + "', NUMER='" + ___form.label3_Numer.Text + "'", conn);
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
i błąd
ora-00933 sql command not properly ended
Weź pomiędzy cmd.Open()
i cmd.ExecuteNonQuery()
daj string command = cmd.CommandText
wyświetl to gdzieś i podaj tu.
Albo pod debugerem podejrzyj to.
Zamiast sklejać w taki sposób to zapytanie, użyj parametrów: http://docs.oracle.com/html/B28089_01/OracleParameterClass.htm już nawet string.Format
byłby czytelniejszy...
Kolejny etap za nami. Zmieniliśmy kod, program nie wyrzuca błędu ale dalej nie pokazują się zmiany po ponownym wczytaniu bazy.
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ś ma pomysł?
Miałem na myśli żebyś wkleił zapytanie SQL a nie rozpisywał problem na dwa tematy. Zrób to co @dam1an napisał http://4programmers.net/Forum/Newbie/169950-edytowanie_wierszy_w_datagridview?p=1070800#id1070800 i pokaż to zapytanie oraz sprawdź pod bazą czy jak dasz SELECT * FROM BAZA WHERE /* GDZIE WHERE TAKI SAMO JAK W PRZYOADKU UPDATE */
to czy znajduje Ci w ogóle takie rekordy.