Arhiva de etichete: .net

Șpârle cu rapoarte Telerik Report Engine (II) – Când nu ești chiar tu însuți

În treacăt fie spus, nu-i vorba de ceva legat de Telerik Report Engine în sine, cât de faptul că reprezintă un mediu unde asemenea probleme pot lesne apărea (și, în definitiv, a ieșit de sub macat după rezolvarea investigației precedente). Așadar, avem un serviciu de raportare ce-și extrage dinamic rapoartele dorite dintr-o tabelă. Fiecare raport conține și DLL-ul ce unde trebuie încărcat și clasa ce-l produce.

Bun, pentru unul din ele, achiziția de date troznea sever cu sânge pe pereți și suficientă confuzie cât să-și reclame propriul gen pe buletin:

An error occurred while invoking data retrieval method. 
---> AutoMapper.AutoMapperMappingException: Missing type map configuration 
or unsupported mapping.

Mapping types:
Object -> SmufItemViewModel
System.Object -> Zbuf.Stuf.Common.ViewModels.SmufItemViewModel

O astfel de eroare înseamnă, pe scurt, că AutoMapper trebuie să creeze un obiect de un tip dintr-un alt obiect de un alt tip fără să aibă cunoștință despre cum s-o facă. Și atunci zice fie Nu știu, d-astea, nu știu!, fie I have no memory of this place. Și mesajul de mai sus este dovada. Atâta doar că, urmărind șirul sfiicios de firimituri lăsat de excepție, la linia în cauză se află:

Citește mai departe →

Șpârle cu rapoarte Telerik Report Engine (I) – Dujmani din umbră

Am primit câteva jelanii vis-a-vis de niște rapoarte ce nu se generau, producând o eroare al draima de pâcloasă la prima vedere: System.ArgumentNullException: Value cannot be null. Vă rog, nu vă înghesuiți cu prea multe detalii că sunt un simplu om!

Foto: Bogdan Stoica

Foto: Bogdan Stoica

Nici stiva de funcții apelate (stack trace, pentru iubitorii de franceză) nu fu cu mult mai clarificatoare, cu atât mai puțin fiindcă problema-și avea originea într-unul din cotloanele umede și-ntunecate ale Telerik Report Engine. Orientativ:

Citește mai departe →

Sintaxa îți ușurează scrisul, nu gândirea

Limbajul C# a evoluat foarte frumos în direcția bogăției și eficienței în exprimare, uneori în detrimentul purității academice. Fiecare versiune pune varii trufandale pentru, bunăoară, reducerea ceremoniei, favorizarea logicii și trimiterea fricii în fundal, ori pentru producția expresivă de valori.

Iar prin frică, desigur, mă refer la manifestările noastre defensive precum verificarea diverselor variabile, indiferent de scop: că este sau nu este null, că un număr stă bine chitit într-un interval bine definit, că un obiect oarecare este „activ” ori ba ș.a.m.d.

Superior pe orice teren

Superior pe orice teren

Ele sunt binevenite, iar eu nu-s omul să nu le folosească, ba se poate spune că prezint o vagă propensitate pentru abuz. Pe de altă parte, nu-s nici omul care să nu cârcotească, deci mai întâi am să trec prin ele mai mult pentru propria-mi plăcere, ca o cafea caldă-ntr-o dimineață rece, apoi o să sorbim și un pic de zaț.

În majoritatea lor covârșitoare, notițele mele acoperă diverse aspecte ale operațiunilor pe baza pattern matching, întinzând câteva tentacule și-n direcția construcției obiectelor, unde, iată, avem acum o nouă opțiune în afara constructorilor standard. Și înainte de-a purcede aș vrea să-mi scarpin o traducere mai elegantă (cât de cât) pentru mâncărimea termenului pattern matching.

Citește mai departe →

O problemă de simultaneitate, Entity Framework și SQL Server

Am avut de curând acel soi de situație neplăcută, știți voi cei din branșă, din acelea ce n-au cum să se-ntâmple; cu alte cuvinte, din acelea ce-au foarte mari șanse de-a se manifesta supărător de intens și frecvent și cu umflături. La origine o problemă de acces simultan la date, unul din motivele pentru care n-ar fi trebuit să apară este simplul fapt că nu există niciun scenariu util, oficial document ori măcar suportat.

Uite mă, Costele, de-aia te-ncurci

Uite mă, Costele, de-aia te-ncurci

Cu totate acestea, operatorii au făcut-o, fiind, drept consecință, necesară o intervenție spre corectare, aplanare și reinstaurea voioșiei și, desigur, o modalitate de-a preveni disfuncționalități ulterioare.

În sine, au existat două cazuri distincte ale problemei date, ambele corespunzătoare aceluiași aspect funcțional (practic insesizabile de către un utilizator):

A) când se actualiza un set de date, respectiv
B) când se crea unul nou.

Citește mai departe →

Crash another day – o utilizare șucară pentru uneltele de testare automată (I)

Consola NextUp ERP Server are o zona pentru afișarea jurnalului cererilor venite de la diverșii consumatori conectați; acea zonă este un fel de casetă text ce nu poate fi modificată, în care se tot adaugă, fără a fi niciodată ajustat sau complet golit conținutul său, afară de situația opririi și repornirii manuale a server-ului.

Atmosferă de lucru

Atmosferă de lucru

Din cauza construcției interne a componentei (DevExpress.XtraEditors.TextBoxMaskBox, am și găsit comportamentul documentat la un moment dat în zona de suport a DevExpress, reclamat de un alt utilizator) tot procesul descris determină creșterea non-liniară a memoriei ocupate de-ntreg programul, sistemul devenind instabil pentru o sesiune de lucru de aproximativ 25000 de cereri (cu sesiuni depășind lejer 100 000) executate-n secvență rapidă (genul programului: aplicație de transfer).

Citește mai departe →

PawntaJs – un server NodeJs pentru generarea elementelor bibliografice

De când mă știu, exersersarea de genul temă pentru acasă nu s-a lipit de mine niciodată. Am destestat cumplit exercițiile izolate undeva-n vid, însă mi-a plăcut teribil de mult să fac lucruri ce oricum m-au învățat mult mai mult.

Referințe

Referințe

Este și motivul de căpătâi pentru care modalitatea de antrenament sugerată de Robert C. Martin în Clean Coder, acele kata, nu prea funcționează, ritualul fiind așa: deschid una, mă uit cu ochi umezi de vițel la poartă nouă, o închid și mă apuc de altceva. Am încercat, aia e.

Citește mai departe →

Mașina de scris automată

Am scris la un moment dat, ca un soi de exercițiu de doi lei, un mic utilitar pentru automatizarea citirii de la tastatură ale proprietăților unui obiect oarecare, cu structură previzibilă, suficient de simplă și relativ strict standardizată. Prin automatizare mă refer la a nu mai scrie per manus codul pentru a prelua valoarea fiecărei proprietăți ci a spune unei clase oarecare, citește-mi, te rog frumos, un obiect de tipul T și dă-mi instanța nou creată.

Motanul Patraulea e oarecum sceptic, dar nu are de ce

Motanul Patraulea e oarecum sceptic, dar nu are de ce

De curând, ce-a fost o la un moment dat o mică distracție pasageră, mi-a fost utilă în punerea la punct a unui banc de testare manuală pentru un sistem care primea contracte bine definite și suficient de simple și parte a rutinei de testare a fost, desigur, că voiam să furnizez valori manuale și să văd reacția instantanee.

Citește mai departe →

Cu boxa bluetooth la dentist

Mi-am luat la un moment dat, de curând, un Marshall Acton III. Boxă bună, alimentată sănătos direct de la rețea, la care te poți conecta inclusiv prin bluetooth. Frumos, elegant, însă doar cât de cât, pentru că are o meteahnă extrem de supărătoare: după zece minute de nefolosire întră-n stand-by, se deconectează de la calculator și rămâne așa până fie rotesc un buton oarecare, fie o reconectez explicit din Vindoză.

Inovare-n tehnologie

Inovare-n tehnologie

Mare păcat, mai ales că intrarea-n stand-by nu poate fi nici dezactivată, nici configurată la un interval mai mare. Ajung, astfel, să mă reconectez manual de fiecare dată când opresc sunetul dintr-un oarecare motiv. Nu e singurul model gândit cu zonele mai întunecate ale părților dorsale, ba mai mult, se pare că au scos posibilitatea de-a dezactiva acest iritant stand-by.

Citește mai departe →

Librărie .NET/C# pentru verificarea contribuabililor pe baza CIF-ului

Din diverse proiecte s-a condensat în timp o mică librărie pentru consumarea serviciului web ANAF prin care se poate verifica existența unui contribuabil, precum și dacă este-nregistrat în scopuri de TVA. De fapt, funcționalitatea oferită este cea din urmă, dar implicit poate fi folosit și pentru verificarea existenței unui cod fiscal.

Detalii

Detalii

Librăria este scrisă pentru .NET 6.0 și a fost gândită pentru serviciul sincron, versiunea 8, a cărui specificație poate fi găsită aici. Cred că poate fi consumată și versiunea 7, dar nu am încercat. În tot cazul, am acoperit toată structura de date oferită de răspuns; n-am avut personal nevoie de toate datele acolo, dar dacă tot am publicat codul, am zis să fie o treabă făcută nu musai cap-coadă, ci măcar cu un cap și cu o coadă.

Citește mai departe →

Știu ce este, dar ce reprezintă?

Mai întâi, desigur, trebuie să stabilim coordonatele discuției. Este vorba despre situația în care lucrăm (fie pentru că am ales ca atare, fie că nu avem de-ales) la un proiect unde accesul la date este abstractizat:

– printr-un model de date implementat printr-un set de clase (entități);
– folosind un ORM oarecare pentru gestionarea corespondenței dintre entități și diversele artefacte din baza de date (tabele, dar nu numai);
– folosind repository-uri pentru a accesa entitățile respective;
– în sfârșit, ca să adăugăm o dimensiune concretă, folosind C# ca limbaj de bază și Entity Framework drept ORM.

Care-cum?

Care-cum?

Folosind Entity Framework, se pune problema gestionării DbContext-ului, adică a modului în care trebuie distribuit între diversele repository-uri implicate într-o singură tranzacție. Dintre toate variantele, m-am oprit în cele din urmă pe cele descrise aici (și vă recomand să citiți înainte de a continua).

Citește mai departe →

Kobyashi Maru

Am încheiat recent un proiect având interacțiunea cu o bază de date SQL Server prin Entity Framework (EF) 6.3, elemente care nu puteau fi supuse modificării. Nu că ar fi ceva rău, nu că as avea ceva de obiectat, dar este important de menționat pentru restul povestirii.

Ilustrație - DALL-E2

Ilustrație – DALL-E2

Pe lângă legătura standard dintre entități și tabele (sau view-uri) din baza de date, am fost nevoit să folosesc și interogări construite, folosind, Database.SqlQuery<TSmuff>(), pe baza unor funcții SQL ce returnează date tabelare, dar cu parametri ceva mai… deosebiți – TVP, adică Table Valued Parameters.

Acest fapt necesită crearea explicită a unor instanțe de DbParameter; nu pot fi transmise pur și simplu valorile, fapt ce-ar lăsa-n sarcina EF crearea instanțelor de DbParameter atunci când este momentul. Și, ca o restricție suplimentară: Database.SqlQuery<>() acceptă drept argumente ori doar valori, ori doar instanțe de DbParameter; nu poți să le combini.

Citește mai departe →