Update Id w bazie

0

Witam
Mam mały problem z realizacją updet'a w mojej bazie. Oto kod ktory mam teraz

SqlCeCommand cmt = new SqlCeCommand(stv, cms);
            SqlCeDataAdapter Adapter = new SqlCeDataAdapter(cmt);
            bazaDataSet1.Clear();
            Adapter.Fill(bazaDataSet1, "Zag");
            dataGridView1.DataSource = bazaDataSet1.Tables["Zag"];
            if (cmk != cmc)
            {
                while (cmc < cmk)
                {
                    tmp4 = cmc+1;
                    string stz = "update Zag set id = '"+Convert.ToString(cmc)+"' where id='" + Convert.ToString(tmp4) + "'";
                    SqlCeCommand cme = new SqlCeCommand(stz, cms);
                    cmb.ExecuteNonQuery();
                   
                    cmc++;
                }
            }

            cms.Close();

Chodzi mi głównie o to, że kasuje dany wiersz z bazy - to mam już zrobione - a po wykasowaniu id nie mają dziury tzn. ma być " 1,2,3" a nie "1,3,4".

0

Piękne nazwy zmiennych. No i ten Convert.ToString(), w życiu nie wpadłbym, że tak się da.

A w czym problem? Że baza nie pozwala nadać ponownie tego samego ID nowemu rekordowi? To chyba normalne jeśli ma się ustawiony autoincrement...

0

Pól ID się nie updatuje. One jak sama nazwa mówi mają coś identyfikować.

załóżmy taki scenariusz:
table zamówienia(id, klient_id, data_zamówienia, coś_tam_jeszcze)
table klient(id, imię, nazwisko, coś_tam)

klient 4 ma zmówienie, klienta 3 usuwasz, klient 4 zmienia się automatycznie w klienta 3. Co z jego zamówieniem? też ma się uaktualnić? Każde odwołanie do klienta 4 w całej bazie ma robić update?
I potem jeszcze dla wszystkich klientów od 4 w górę?

Poza tym zapytań się nie klei ze stringów tylko używa się parametrów.

pzdr.

0
biernik napisał(a)

załóżmy taki scenariusz:
table zamówienia(id, klient_id, data_zamówienia, coś_tam_jeszcze)
table klient(id, imię, nazwisko, coś_tam)

klient 4 ma zmówienie, klienta 3 usuwasz, klient 4 zmienia się automatycznie w klienta 3. Co z jego zamówieniem? też ma się uaktualnić? Każde odwołanie do klienta 4 w całej bazie ma robić update?
I potem jeszcze dla wszystkich klientów od 4 w górę?

pzdr.

Prawie o to mi chodzi, tabela wygląda następująco:
table xxx(id, nazwa, dane, i coś tam jeszcze)
-id ma się aktualizować we wszystkich wierszach z większym id niż ten usunięty,
-nazwa która zostaje usunięta z tabeli, ma zostać wykasowana w całej bazie.
Z góry dzięki za pomoc.

0

Żeby odwołania do usuwanego pola się same usuwały góglij za czymś takim "on delete cascade"

Co do updatowania ID, weźmy jeszcze raz te zamówienia, załóżmy, że ktoś miał wydrukowane potwierdzenie zamówienia, i przychodzi do Ciebie z tym wydrukiem i ma tam napisane "Zamówienie 5", wklepujesz do systemu nr 5 i dostajesz coś zupełnie innego, chyba nie o to chodzi.

ID się nie updatuje, ID to ID od urodzenia do śmierci, przyjmij jako aksjomat.

Pzdr.

--edit--
Właściwie to odpowiedz sobie na pytanie: dlaczego chcesz zmieniać ID?

0

bo chce pewnie mieć równe cyferki ;p

0
biernik napisał(a)

Właściwie to odpowiedz sobie na pytanie: dlaczego chcesz zmieniać ID?

Id w tym przypadku jest numerem strony dokumentu. Jeśli wykasuje stronę np.5 a dokument miał 10 stron, to teraz ma stron 9 a strony o numerach 6 - 10 maja póxniej numery 5-9. A zapis jaki muszę uzywać to "2 z 9"

0

ja się podczepię, jaką komendę dać pod buttonem w sql aby wyczyścić całą tabele ?

ok mam

TRUNCATE TABLE nazwa_tabeli

0

widze, że kolega używa MSSQL więc składnia zapytania może być następująca (działa od 2005):

select rank() over (order by id) as NumerStrony, ... from <tabela>

pzdr,

0
tjj napisał(a)

widze, że kolega używa MSSQL więc składnia zapytania może być następująca (działa od 2005):

select rank() over (order by id) as NumerStrony, ... from <tabela>

pzdr,

to by zdało egzamin, ale w takim wypadku muszę sprawdzać jakie jest obecnie najwyższe Id w tabeli gdy chcę wprowadzać nową linię.

0
yuri11 napisał(a)

Id w tym przypadku jest numerem strony dokumentu. Jeśli wykasuje stronę np.5 a dokument miał 10 stron, to teraz ma stron 9 a strony o numerach 6 - 10 maja póxniej numery 5-9. A zapis jaki muszę uzywać to "2 z 9"

Czyli zwaliłeś projekt bazy, a teraz szukasz dziwacznych obejść?
Id to id, numer strony to numer strony. To dwie oddzielne kolumny.

0
somekind napisał(a)
yuri11 napisał(a)

Id w tym przypadku jest numerem strony dokumentu. Jeśli wykasuje stronę np.5 a dokument miał 10 stron, to teraz ma stron 9 a strony o numerach 6 - 10 maja póxniej numery 5-9. A zapis jaki muszę uzywać to "2 z 9"

Czyli zwaliłeś projekt bazy, a teraz szukasz dziwacznych obejść?
Id to id, numer strony to numer strony. To dwie oddzielne kolumny.

po prostu na początku założyłem, że mogę używać do numerowania id, jednak sie nie udało. Teraz muszę wymyślić jak sprawdzać jakie id jest największe. Będzie ono używane jedynie do ustalania kolejności powstawania rekordów w bazie, a numery stron spróbuje zrobić tak jak napisał kolega tjj.

0

'PAGE '+CAST(RANK() OVER(ORDER BY ID) AS VARCHAR)+' OF ' +CAST(COUNT(*) OVER() AS VARCHAR) AS PAGE_NUMBER, inne, pola, z, tabeli from tabela where coś = ileś order by id

W ten sposób dostaniesz ponumerowane rekordy w kolejności ID.
Lepiej opisać problem, zamiast pytać jak wsadzić kwadratowy klocek w okrągły otwór ;-)

Pozdrówka.

0

Dzięki za wszystkie podpowiedzi ale chyba jestem jakiś małorozumny :/
oto jak wstawiłem podpowidzi do kodu:

 System.Data.SqlServerCe.SqlCeConnection cms;
            cms = new SqlCeConnection(@"Data Source=Baza.sdf;Persist Security Info=True");
            cms.Open();
            string str = "select row_number() over (order by id) as strona, t1, t2, opis, id  from Zag order by id ";
            using (SqlCeCommand cmt = new SqlCeCommand(str, cms))
            {
                SqlCeDataAdapter Adapter = new SqlCeDataAdapter(cmt);
                bazaDataSet1.Clear();
                Adapter.Fill(bazaDataSet1, "Zag");
                dataGridView1.DataSource = bazaDataSet1.Tables["Zag"];
                cms.Close();
            }

niestety jak chce wyświetlić datagrid wywala mi błąd

spróbowałem jeszcze coś takiego, aby wyświetlić bezpośrednio do labela ale też nie wychodzi :(

string str = "select 'strona'+CAST(RANK() OVER(ORDER BY id) AS VARCHAR)+' z ' +CAST(COUNT(*) OVER() AS VARCHAR) AS '"+label3.Text+"'  from Zag where t1 = '" + tb1.Text + "' order by id "; 

już sam nie wiem co robić.

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