Anna Sałacińska 1 Napisano 26 Maja 2021 Udostępnij Napisano 26 Maja 2021 w Limit danych w SDK (edytowane) Dzień dobry, w jaki sposób można dodać limit pobieranych danych przez sdk ? Chodzi o to że ilość danych do jednorazowego pobrania jest tak duża że dostaję time out od serwera. Próbowałam coś takiego IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>(); zamowienia.Dane.Wszystkie() .Where(z => z.FlagaWlasna.Id == 123) .Take(50) ale tu również jest time out ----- edit: coś tu jest nie tak, dodałam limit po dacie wystawienia na dzień gdzie jest 60 zk i dalej jest time out. Co ciekawe wciągnęłam zapytanie które się wtedy się wykonuje i w management studio robi się ono w sekundę ... Ktoś ma jakikolwiek pomysł co z tym zrobić ? Poniżej zwracany wyjątek Cytat System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Upłynął limit czasu wykonywania. Limit upłynął przed ukończeniem operacji lub serwer nie odpowiada. ---> System.ComponentModel.Win32Exception: Upłynął limit czasu operacji oczekiwania --- Koniec śladu stosu wyjątków wewnętrznych --- w System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) w System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) w System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) w System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() w System.Data.SqlClient.SqlDataReader.get_MetaData() w System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) w System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) w System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) w System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) w System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext) --- Koniec śladu stosu wyjątków wewnętrznych --- w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext) w System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) w System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) w System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__26_0() w System.Lazy`1.CreateValue() w System.Lazy`1.LazyInitValue() w System.Lazy`1.get_Value() w System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() w System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) w System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) w goBasketFakturowacz.Form1.button1_Click(Object sender, EventArgs e) w \Form1.cs:wiersz 152 w System.Windows.Forms.Control.OnClick(EventArgs e) w System.Windows.Forms.Button.OnClick(EventArgs e) w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) w System.Windows.Forms.Control.WndProc(Message& m) w System.Windows.Forms.ButtonBase.WndProc(Message& m) w System.Windows.Forms.Button.WndProc(Message& m) w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) Edytowane 26 Maja 2021 przez Anna Sałacińska Link to postu
Paweł Kubacki 192 Napisano 27 Maja 2021 Udostępnij Napisano 27 Maja 2021 w Limit danych w SDK Pani Aniu, jeżeli mamy Pani pomóc w rozwiązaniu tego problemu, to prosiłbym bardzo o umieszczenie oryginalnego kodu tego rozwiązania własnego, bez uproszczeń, modyfikacji i wycinania czegokolwiek. Treść zamieszczonego wyjątku nie odpowiada przykładowi, który Pani podała. Link to postu
Anna Sałacińska 1 Napisano 27 Maja 2021 Autor Udostępnij Napisano 27 Maja 2021 w Limit danych w SDK Całość wygląda tak jak poniżej te dodatkowe klasy to tak na dobrą sprawę proste struktury potrzebne do innego systemu. To znaczy zawierają metody ale na tym etapie żadna nie jest uruchamiana. Sklep.flaga.id zawiera identyfikator zapisany w konfigu programu dataOd i dataDo to komponenty System.Windows.Forms.DateTimePicker zkBindingSource to System.Windows.Forms.BindingSource ale do tej linijki już nie dochodzi. I małe sprostowanie, wczoraj napisałam że zapytanie zwraca 60 zk, teraz zauważyłam że tam są pozycje dokumentów czyli zk jest około 30 ponieważ większość ma po 2 pozycje. using (Uchwyt sfera = uruchomSfere()) { IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>(); ITypyAdresu typyAdresu = sfera.PodajObiektTypu<ITypyAdresu>(); int rodzajeKontaktu = sfera.PodajObiektTypu<IRodzajeKontaktu>().DaneDomyslne.Email.Id; int flaga = sfera.PodajObiektTypu<IFlagiWlasne>().Dane.Wszystkie().Where(f => f.Id == Sklep.flaga.id).First().Id; var dataSource = zamowienia.Dane.Wszystkie() .Where(z => z.DataWprowadzenia>=dataOd.Value && z.DataWprowadzenia <= dataDo.Value && z.FlagaWlasna.Id == flaga) .Select(select => new Zk() { id = select.Id, numerZamowienia = select.NumerZewnetrzny, numerZk = select.NumerWewnetrzny.PelnaSygnatura, chcekd = false, data = select.DataWprowadzenia, waluta = select.Waluta.Symbol, kontrahent = new Zk.Kontrahent() { nazwa = select.Podmiot.AdresPodstawowy.Nazwa, nazwaSkrocona = select.Podmiot.NazwaSkrocona, miejscowosc = select.Podmiot.AdresPodstawowy.Szczegoly.Miejscowosc, kodPocztowy = select.Podmiot.AdresPodstawowy.Szczegoly.KodPocztowy, nrDomu = select.Podmiot.AdresPodstawowy.Szczegoly.NrDomu, nrLokalu = select.Podmiot.AdresPodstawowy.Szczegoly.NrLokalu, ulica = select.Podmiot.AdresPodstawowy.Szczegoly.Ulica, mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc, nip = select.Podmiot.NIP, firma = select.Podmiot.Firma.Nazwa }, kontrahentDostawa = new Zk.Kontrahent() { nazwa = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Adres.Nazwa, miejscowosc = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Miejscowosc, kodPocztowy = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.KodPocztowy, nrDomu = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.NrDomu, nrLokalu = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.NrLokalu, ulica = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Ulica, }, produkty = select.Pozycje .Select(p => new Zk.Produkt() { ilosc = p.Ilosc, indeks = p.AsortymentAktualny.Symbol, typ = p.RodzajAsortymentuId, cena = p.Cena.BruttoPrzedRabatem, rabat = p.Cena.RabatProcent, vat = p.StawkaVat.Stawka, }) }) .ToList(); zkBindingSource.DataSource = dataSource; } Link to postu
Paweł Kubacki 192 Napisano 27 Maja 2021 Udostępnij Napisano 27 Maja 2021 w Limit danych w SDK Dziękuje. Teraz wiadomo już znacznie więcej. Ilość zwracanych danych nie jest w tym przypadku aż tak istotna. Bardziej istotna jest sama forma tego zapytania oraz postać generowanego zapytania SQL. Przy pomocy profilera SQL można je podejrzeć. Widać wówczas, że wynikowy SQL zawiera 115 JOIN-ów. Stosując drobną optymalizację można zmniejszyć ilość JOIN-ów do 36 (warunek WHERE ze względu na brak interfejsu użytkownika jest nieco inny niż w Pani przykładzie) zamowienia.Dane.Wszystkie() .Where(x => x.DataWprowadzenia > new DateTime(2000, 5, 1) && x.DataWprowadzenia < new DateTime(2020, 12, 31) && (x.FlagaWlasna == null || x.FlagaWlasna.Id == 1230)) .Select(x => new { Dok = x, Podmiot = x.Podmiot, Adres = x.Podmiot.AdresPodstawowy.Szczegoly, AdresDostaw = x.Podmiot.DomyslnyAdresDostaw.Szczegoly, }) .Select(select => new Zk() { id = select.Dok.Id, numerZamowienia = select.Dok.NumerZewnetrzny, numerZk = select.Dok.NumerWewnetrzny.PelnaSygnatura, chcekd = false, data = select.Dok.DataWprowadzenia, waluta = select.Dok.Waluta.Symbol, kontrahent = new Zk.Kontrahent() { nazwa = select.Podmiot.AdresPodstawowy.Nazwa, nazwaSkrocona = select.Podmiot.NazwaSkrocona, miejscowosc = select.Adres.Miejscowosc, kodPocztowy = select.Adres.KodPocztowy, nrDomu = select.Adres.NrDomu, nrLokalu = select.Adres.NrLokalu, ulica = select.Adres.Ulica, mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc, nip = select.Podmiot.NIP, firma = select.Podmiot.Firma.Nazwa }, kontrahentDostawa = new Zk.Kontrahent() { nazwa = select.AdresDostaw.Adres.Nazwa, miejscowosc = select.AdresDostaw.Miejscowosc, kodPocztowy = select.AdresDostaw.KodPocztowy, nrDomu = select.AdresDostaw.NrDomu, nrLokalu = select.AdresDostaw.NrLokalu, ulica = select.AdresDostaw.Ulica, }, produkty = select.Dok.Pozycje .Select(p => new Zk.Produkt() { ilosc = p.Ilosc, indeks = p.AsortymentAktualny.Symbol, typ = p.RodzajAsortymentuId, cena = p.Cena.BruttoPrzedRabatem, rabat = p.Cena.RabatProcent, vat = p.StawkaVat.Stawka, }) }) .ToList() Jednak najlepszą optymalizację można uzyskać zmieniając nieco formę zapytania. Wówczas ilość JOIN-ów zmniejsza się do 17. (from z in zamowienia.Dane.Wszystkie() let podmiot = z.Podmiot let adres = podmiot.AdresPodstawowy let adresSzczegoly = adres.Szczegoly let adresDostaw = podmiot.DomyslnyAdresDostaw let adresDostawSzczegoly = adresDostaw.Szczegoly where z.DataWprowadzenia > new DateTime(2000, 5, 1) && z.DataWprowadzenia < new DateTime(2020, 12, 31) && (z.FlagaWlasna == null || z.FlagaWlasna.Id == 1230) select new Zk() { id = z.Id, numerZamowienia = z.NumerZewnetrzny, numerZk = z.NumerWewnetrzny.PelnaSygnatura, chcekd = false, data = z.DataWprowadzenia, waluta = z.Waluta.Symbol, kontrahent = new Zk.Kontrahent() { nazwa = adres.Nazwa, nazwaSkrocona = podmiot.NazwaSkrocona, miejscowosc = adresSzczegoly.Miejscowosc, kodPocztowy = adresSzczegoly.KodPocztowy, nrDomu = adresSzczegoly.NrDomu, nrLokalu = adresSzczegoly.NrLokalu, ulica = adresSzczegoly.Ulica, mail = podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc, nip = podmiot.NIP, firma = podmiot.Firma.Nazwa }, kontrahentDostawa = new Zk.Kontrahent() { nazwa = adresDostaw.Nazwa, miejscowosc = adresDostawSzczegoly.Miejscowosc, kodPocztowy = adresDostawSzczegoly.KodPocztowy, nrDomu = adresDostawSzczegoly.NrDomu, nrLokalu = adresDostawSzczegoly.NrLokalu, ulica = adresDostawSzczegoly.Ulica, }, produkty = z.Pozycje .Select(p => new Zk.Produkt() { ilosc = p.Ilosc, indeks = p.AsortymentAktualny.Symbol, typ = p.RodzajAsortymentuId, cena = p.Cena.BruttoPrzedRabatem, rabat = p.Cena.RabatProcent, vat = p.StawkaVat.Stawka, }) }).ToList() 1 Link to postu
Anna Sałacińska 1 Napisano 31 Maja 2021 Autor Udostępnij Napisano 31 Maja 2021 w Limit danych w SDK Na razie próbuje ogarnąć geniusz tych zmian, ale ważne że działa. Dziękuję Link to postu
Polecane posty