Paweł Wyrozumski

Paweł Wyrozumski Developer Baz Danych

Temat: Update DataTable

Witam.
W bazach danych można dokonywać insertów i updatów danych jednej tabeli do drugiej np:

update tabela2 set tabela2.kwota = tabela1.kwota
from tabela2, tabela1
where tabela2.id = tabela1.id

Pytanie moje jest takie. Czy można przekazać obiekt DataTable do procedury tak, aby procedura dokonała zmian w tabeli2 o dane z tabeli1, która byłaby właśnie owym DataTablem.

konto usunięte

Temat: Update DataTable

`Piotr Sowa edytował(a) ten post dnia 12.02.12 o godzinie 14:57
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: Update DataTable

Procedura == procedura składowana - nie
Procedura == metoda (funkcja) w kodzie aplikacji - tak

możesz również w kodzie aplikacji napisać sobie inserta/updatea, i użyć metody ExecuteNonQuery klasy SQLCommend. Takie inserty można budować w pętli, przeglądającej wiersze datatable.

Temat: Update DataTable

Być może się przyda.

Do UDP można przekazać DataTable zserializowane do postaci XML (i jest taki typ danych w TSQL).
Poniżej przykład importu danych z dokumentu XML za pomoca UDP do istniejących tabel.

http://updatedev.blogspot.com/2008/08/importowanie-dan...Adrian Olszewski edytował(a) ten post dnia 27.01.09 o godzinie 18:05
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: Update DataTable

Marcin Pigłowski:
Procedura == procedura składowana - nie
Procedura == metoda (funkcja) w kodzie aplikacji - tak

możesz również w kodzie aplikacji napisać sobie inserta/updatea, i użyć metody ExecuteNonQuery klasy SQLCommend. Takie inserty można budować w pętli, przeglądającej wiersze datatable.

Mam kilka pytań w związku z tematem. Czy jest to najszybsza, dostępna metoda zapisu (pętla + SqlCommand)? Załóżmy, że mój użytkownik zmienia harmonogram spłaty kredytu 100 klientów. Zakładając, że każdy harmonogram ma po 100 rat mam do update’owania (lub insert’owania) 10100 wierszy (100 harmonogramów i 10000 ratHarmonogramu) w dwóch tabelach (Harmonogram i RataHarmonogramu). Oczywiście to może być dużo więcej harmonogramów i dużo więcej rat, o danych dodatkowych w innych tabelach nie wspomnę :). Zatem:
1. Jak najszybciej wpakować taką porcje danych do bazy, zakładając że trzymam je sobie w DataTable,
2. Stosować Procedury Składowe czy zapytania tekstowe (CommandType.StoredProcedure czy CommandType.Text),
3. Chciałbym tu użyć transakcji (SqlTransaction) – czy to spowolni proces zapisu i czy w ogóle tak transakcja nie ma ograniczeń na duże ilości danych?

Czyli innymi słowy jak najszybciej zapisać duża porcję danych, tak żeby użytkownik się nie wściekał :). Mając do dyspozycji SQL Serwer 2000.

konto usunięte

Temat: Update DataTable

Norbert Maziarz:
Czyli innymi słowy jak najszybciej zapisać duża
porcję danych, tak żeby użytkownik się nie wściekał :). Mając do dyspozycji SQL Serwer 2000.
Pytanie bardziej do Ciebie, czy SqlBulkCopy współpracuje z SQL 2000? MSDN nie mówi nic aby nie, więc możesz spróbować, oczywiście musisz jakoś pokombinować wrzucanie danych do tabelki (pytanie, czy można do temporarnej) i potem odpalić procedurę obrabiającą. Ja takie rzeczy na 2000 robiłem w DTSach.
Sam SQL2000 nie prekompiluje czystych zapytań, więc na nim warto używać procedur zamiast CommandType.Text

A na pewno nie masz dostępu do SQL2005? Bo wtedy można by tabelkę przez jeden parametr przekazać i uwinąć się w jednym roundtripie do serwera. IMHO największa strata to i tak czas stracony na przesyle danych więc im mniej komend tym lepiej.
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: Update DataTable

A na pewno nie masz dostępu do SQL2005? Bo wtedy można by tabelkę przez jeden parametr przekazać i uwinąć się w jednym roundtripie do serwera. IMHO największa strata to i tak czas stracony na przesyle danych więc im mniej komend tym lepiej.

No niestety, jeszcze przez jakiś czas muszę korzystać z 2000 :(
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: Update DataTable

na pewno w transakcji, może nie koniecznie całość, ale każdy harmonogram plus 100 rat do niego trzeba przesłać w jednej transakcji (przynajmniej tak mi się wydaje z biznesowego punktu widzenia).
Można kombinować z zapisem do plików i importem danych. Czy te 100 harmonogramów jest jakoś ze sobą powiązane, czy to taki przykład, bo raczej nie wydaje mi się, żeby użytkownik edytował 100 klientów i po wszystkim zapisał zmiany.
Może jakieś uogólnienia występują w danych wtedy mniej trzeba było by przesłać do serwera a serwer załatwiłby resztę.
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: Update DataTable

Marcin Pigłowski:
na pewno w transakcji, może nie koniecznie całość, ale każdy harmonogram plus 100 rat do niego trzeba przesłać w jednej transakcji (przynajmniej tak mi się wydaje z biznesowego punktu widzenia).
Dokładni jest to bardzo istotne. Optymalnie by było, żeby transakcja objęła całą paczkę 100 harmonogramów, ale obawiam się czy nie zderzę się z tu z jakąś ścianą, ze względu bądź to na ograniczenia mechanizmu transakcji w .NET (co do ilości "pilnowanych" danych) bądź spowolnienie zapisu. To takie moje „potencjalne obawy” – nigdy nie robiłem transakcji na dużych ilościach danych.
Można kombinować z zapisem do plików i importem danych. Czy te 100 harmonogramów jest jakoś ze sobą powiązane, czy to taki przykład, bo raczej nie wydaje mi się, żeby użytkownik edytował 100 klientów i po wszystkim zapisał zmiany.
Może jakieś uogólnienia występują w danych wtedy mniej trzeba było by przesłać do serwera a serwer załatwiłby resztę.

Tak jest to przykład, ponieważ proces o którym mówię jest na tyle unikalny, że trudno by go było szybko i rzeczowo wytłumaczyć. Harmonogramy są tu najlepiej zbliżonym mechanizmem, z tym założeniem, że są ze sobą powiązane. Użytkownikowi wyświetlają się one na kolejnych tabPage’ach i on jeden raczy wiedzieć co w którym zmieni. Mogą tym rządzić pewne reguły, ale nie muszą. Gdyby jakaś reguła istniała np. zmieniło się oprocentowanie dla danej grupy klientów to bym to po prostu robił na serwerze, niestety tak dobrze nie mam :D. Jedynym sposobem przyśpieszenia zapisu jaki widzę to: zoptymalizowanie procesu fizycznego zapisu + zapisywanie tylko tego co się rzeczywiście zmieniło – jakaś ewidencja zmian. Chyba nic ponad to nie wycisnę.

konto usunięte

Temat: Update DataTable

`Piotr Sowa edytował(a) ten post dnia 12.02.12 o godzinie 14:58
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: Update DataTable

Norbert Maziarz:

Dokładni jest to bardzo istotne. Optymalnie by było, żeby transakcja objęła całą paczkę 100 harmonogramów, ale obawiam się czy nie zderzę się z tu z jakąś ścianą, ze względu bądź to na ograniczenia mechanizmu transakcji w .NET (co do ilości "pilnowanych" danych) bądź spowolnienie zapisu. To takie moje „potencjalne obawy” – nigdy nie robiłem transakcji na dużych ilościach danych.

wydaje mi się że ze 100 insertami/updatemi sobie poradzi. Jak napisał Piotrek można sprawdzać z dt czy wartość się zmieniła to też pozwoli Ci zmniejszyć ilość zapytań.

Następna dyskusja:

DataTable




Wyślij zaproszenie do