UPDATE ExecuteNonQuery

0

Witam,
Mam CommandText w SQLCommand.
Za pomocą CT chcę wykonać update na bazie danych.
Chciałbym otrzymać liczbę ile wierszy zostały zmodyfikowanych.

Jak wykonuje polecenie ExecuteNonReader() to zwraca mi ilość wszystkich rekordów, a nie ilość modyfikowanych.

W jaki sposób mogę osiągnąć row(s) affected znany z ManagementStudio.

0

Na poleceniu Insert działa poprawnie.
Ja wykonuje UPDATE i zwraca mi ilość WSZYSTKICH rekordów, które sprawdzi, a nie ilość edytowanych.

1

mylisz się - wszystkie rekordy zostały zmienione ale niektóre na taką samą wartość. Jak ustawisz triggera ON UPDATE to wykona się on na tych, które zostały zmienione na takie same. Baza nie wnika czy zmienia na takie same czy na inne - ona ma zmienić konkretne rekordy (a właściwie to pola konkretnych rekordów) na konkretną wartość. Nie chcesz ruszać tych, które daną wartość mają to musisz je w warunku umieścić

0

Zgodzę się z Tobą.
Tylko nie bardzo mogę ustawić on update na bazie.
Mam chyba 10 warunków na where i ManagementStudio zwraca mi ile faktycznych rekordów zmienił, a C# SQLCommand zwraca ilość wszystkich rekordów.

Przykład:
TAB1(id,name)(1,a)(2,a)
update TAB1
set name = b
where id = 2

ManagementStudio dostanę 1
SQLCommand w C# dostaję 2

A chciałbym w c# również otrzymać 1

1

teraz coś ściemniasz - ExecuteNonQuery (a nie ExecuteNonReader jak napisałeś wcześniej) zwraca ilość rekordów (nie wiem jak to przetłumaczyć) faktycznie zmienionych/dodanych/usuniętych w zależności od polecenia a nie wszystkich w bazie. Nie ma takiej możliwości aby przy dwóch rekordach

id wart
1 a
2 b
polecenie UPDATE tab SET wart = 'x' WHERE id = 1 zwróciło 2 jako ilość zmienionych

Co innego np.

id wart
1 a
2 b
1 c
1 b
UPDATE tab SET wart = 'a' WHERE id = 1 zwróci 3 a nie 2 bo faktycznie zmienione zostały 3 ale tylko 2 będą inne niż były
0

cmdIns.CommandText = "UPDATE "
+ Globals.ConnectionParams.GetTableName("ASSORT_WH")
+ " set IS_VISIBLE = 0 from " + Globals.ConnectionParams.GetTableName("ASSORT_WH_VIEW")
+ " WV where WV.STOCK_QTY = 0 (...)
+ " and WV.ART_ID = 170099;";
IlośćModyfikacji = cmdIns.ExecuteNonQuery();

Po wykonaniu ExecuteNonQuery mam wartość 8 tys, która jest równa liczbie rekordów w ASSORT_WH ostatni warunek ART_ID upewnia mnie, że realnie zmieniam tylko 1 rekord.
Chciałbym aby do zmiennej ilośćModyfikacji przypisać wartość = 1.

0

wydaje mi się, że masz po prostu źle (może nie źle z punktu widzenia składni bo działa) napisane to zapytanie. Najprawdopodobniej przelatuje i tak całą tabelę do update ale zmienia tylko kilka rekordów (tutaj akurat jeden). Zobacz ten przykład https://msdn.microsoft.com/en-us/library/ms177523.aspx#OtherTables - w szczególności zwróć uwagę na to iż po FROM masz najpierw tą samą tabelę, którą masz w UPDATE a dopiero potem masz JOIN z drugą tabelą. U Ciebie jest od razu druga tabela i tutaj wydaje mi się jest problem ze zwracaniem faktycznej ilości "pomacanych" rekordów przez zapytanie

0

Dzięki za pomoc.
Rozwiązałem w inny sposób.
Najpierw wykonuje polecenie select przy tych samych warunkach, które są wykorzystywane do update z którego wyciągam ART_ID i buduję listę INTów.
Następnie dla każdego elementu listy wykonuje Update. Ilość edytowanych = ilości elementów w liście.
Podejrzewam, że można było inaczej być może prościej, ale wyszedłem z założenia że jak działa to jest w porządku.

1

pewnie, że można prościej :p

update tabela set pole = 0 where id in (select tab_id from inna_tabela where warunki = dla and innej = tabeli)

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