Havit.Data
2.1.0
Prefix Reserved
dotnet add package Havit.Data --version 2.1.0
NuGet\Install-Package Havit.Data -Version 2.1.0
<PackageReference Include="Havit.Data" Version="2.1.0" />
<PackageVersion Include="Havit.Data" Version="2.1.0" />
<PackageReference Include="Havit.Data" />
paket add Havit.Data --version 2.1.0
#r "nuget: Havit.Data, 2.1.0"
#:package Havit.Data@2.1.0
#addin nuget:?package=Havit.Data&version=2.1.0
#tool nuget:?package=Havit.Data&version=2.1.0
HAVIT .NET Framework Extensions - Data Class Library
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- Havit.Core (>= 2.0.43)
- Microsoft.Data.SqlClient (>= 7.1.1)
- System.Security.Cryptography.Pkcs (>= 10.0.13)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Havit.Data:
| Package | Downloads |
|---|---|
|
Havit.Business
HAVIT .NET Framework Extensions - Business Class Library |
GitHub repositories
This package is not used by any popular GitHub repositories.
v2.1.0 (10/2026)
• Odstraněny členy označené [Obsolete]: DataRecord konstruktory (DataRow/IDataRecord s parametrem bool fullLoad nebo bez rozsahu načtení) a metody Load<T>, LoadObject, LoadString, LoadInt32, LoadDouble, LoadBoolean, LoadDateTime (použijte konstruktory s DataLoadPower a TryGet<T>()).
• BREAKING CHANGE: Přechod z System.Data.SqlClient na Microsoft.Data.SqlClient 7.1.1.
• DbConnector.ExecuteTransaction: oprava, požadovaný IsolationLevel se nepoužíval, transakce vždy běžela s výchozí izolací (chyba od roku 2012). Nyní se transakce zakládá s požadovanou izolací. Kód, který předával jinou izolaci než Unspecified (např. Serializable, Snapshot), ji nyní skutečně dostane (Snapshot vyžaduje povolenou snapshot izolaci v databázi).
• DbLockedCriticalSection: oprava souběhu při sdílení jedné instance více vlákny (např. singleton v DI). Výsledek sp_getapplock se dříve ukládal do instanční property, takže výsledek jednoho volání mohl přepsat výsledek jiného a kritická sekce mohla proběhnout bez zámku (nebo naopak selhat, i když zámek držela).
• DbLockedCriticalSection: zámek se explicitně uvolňuje i tehdy, když kritická sekce skončí výjimkou (původní výjimka není zakryta), a uvolnění v ExecuteActionAsync se již neruší zrušeným CancellationTokenem. Dříve zámek při výjimce držela session, jejíž spojení se vrátilo do connection poolu, až do resetu spojení, a ostatní instance aplikace čekaly na zámek.
• DbConnector.ExecuteNonQuery a ExecuteScalar: při výjimce se zavírá pouze spojení, které si DbConnector otevřel sám. Dříve se zavíralo i spojení otevřené volajícím, čímž se zahodila i jeho transakce (stejně jako to již dělal ExecuteReader správně).
• BREAKING CHANGE: DbConnector.ExecuteReader vrací při vypnutém trace (výchozí stav) přímo reader providera (např. SqlDataReader), ne obal TraceDbDataReader. Trace infrastruktura (DbConnectorTrace, DbCommandTraceData a jejich parametry) se při vypnutém trace již nealokuje pro žádný příkaz (ExecuteReader, ExecuteScalar, ExecuteNonQuery, ExecuteDataSet, ExecuteDataTable), což snižuje alokace zejména u dotazů s mnoha parametry. Při zapnutém trace se chování nemění.
• TraceDbDataReader.Close: lze volat opakovaně (Close + Dispose), dříve při druhém volání vyhodil InvalidOperationException (Read na zavřeném readeru).
• BREAKING CHANGE: Odstraněny hodnoty SqlServerCe35 a SqlServer2005 z enumu SqlServerPlatform, podpora SQL Server Compact Edition 3.5 a SQL Server 2005 skončila (zůstávají SqlServer2008 a SqlServer2012).
• DbConnector.ExecuteTransaction: při zadané vnější transakci a požadavku na jiný IsolationLevel (než Unspecified), než má vnější transakce, je nyní hned vyhozena InvalidOperationException s popisem příčiny (a transactionWork se nespustí). Dříve se zkoušelo založit druhou transakci na spojení s běžící transakcí, což SqlClient odmítl výjimkou o paralelních transakcích. Opravena i zavádějící dokumentace přetížení (vnořená transakce se nezakládá, nikdy se nevrací původní izolace).
• DbConnector.ExecuteTransaction: pokud selže založení transakce (např. nepodporovaný IsolationLevel nebo přerušené spojení), je spojení, které metoda otevřela, zavřeno. Dříve zůstalo otevřené a neuvolnilo se do connection poolu.
• DataRecord.Get a TryGet: převod na Nullable<T> z jiného typu (např. smallint na int?, decimal na double?, tedy i GetNullableInt32 nad sloupcem smallint) již nepadá na InvalidCastException. Hodnota, která není požadovaného typu ani IConvertible (např. Guid, byte[], DateTimeOffset požadovaný jako DateTime), nyní vyhodí dokumentovanou InvalidCastException místo tichého vrácení default(T).
• DbConnector.Default: při inicializaci z konfigurace se respektuje providerName connection-stringu DefaultConnectionString (dříve byl ignorován a vždy se použil SqlClient; prázdný providerName a "System.Data.SqlClient" i "Microsoft.Data.SqlClient" nadále znamenají Microsoft.Data.SqlClient, nezaregistrovaný providerName nyní vyhodí výjimku). První přístup k Default je thread-safe, souběžné přístupy již nemohou vytvořit více instancí.
• Opakování příkazů při přechodných chybách: příkaz spuštěný v transakci (DbCommand.Transaction není null) se již neopakuje a výjimka se předá volajícímu. Po chybě na serveru může být transakce zrušena a zopakování samotného příkazu by pokračovalo v nekonzistentním stavu, o opakování celé transakce rozhoduje volající. Zda příkaz běží v transakci, se zjišťuje před prvním pokusem, protože SqlClient po ukončení transakce (např. rollback na straně serveru) vrací z DbCommand.Transaction null. Čekání mezi pokusy používá Thread.Sleep místo Task.Delay().Wait() (synchronní API, bez alokace Task a timeru).
• DbConnector.ExecuteDataSet a ExecuteDataTable: při přechodné chybě se naplnění (Fill) opakuje stejně jako u ostatních Execute* metod (dříve se neopakovalo). Spojení si metody otevírají samy (a zavírají jen to, které otevřely), aby bylo opakování možné - adapter by si spojení po chybě sám zavřel.
• DbLockedCriticalSection: ExecuteAction a ExecuteActionAsync validují argumenty (lockValue nesmí být null ani prázdný a smí mít nejvýše 255 znaků, což je limit názvu zdroje sp_getapplock, který delší hodnotu tiše ořezával a různé zámky se mohly splést; criticalSection nesmí být null). Vyprší-li timeout SQL příkazu (SqlCommandTimeoutSeconds, výchozí 5 s) dříve než timeout zámku (LockTimeoutMs, výchozí bez omezení), je nyní vyhozena DbLockedCriticalSectionException (s SqlException jako InnerException) místo holé SqlException. Sjednoceny názvy parametrů volání sp_releaseapplock (s @).
• DataRecord: nový konstruktor DataRecord(DataRow, DataRecordSchema, DataLoadPower) umožňuje sdílet jedno schéma (new DataRecordSchema(DataTable)) všemi řádky jedné tabulky, stejně jako je to již možné u readeru. Konstruktor z DataRow nyní při null řádku vyhazuje ArgumentNullException.
• Dokumentace: DataRecordSchema popisuje omezení (schéma musí pocházet ze stejného zdroje jako DataRecordy, kontroluje se jen počet sloupců; názvy sloupců se porovnávají s rozlišením velikosti písmen; u duplicitních názvů platí poslední) a IntTable.GetSqlParameterValue upozorňuje, že vrácenou hodnotu nelze materializovat (všechny prvky jsou jedna instance SqlDataRecord). Chování se nemění, je pokryto testy.
• CustomCommandTimeoutWrappingDbProviderFactory: konstruktor kontroluje argumenty (null zapouzdřený factory vyhodí ArgumentNullException, záporný timeout ArgumentOutOfRangeException) hned při vytvoření, dříve až při prvním použití (NullReferenceException, resp. výjimka při nastavení CommandTimeout). Opravena dokumentace: CreateCommandBuilder je delegována, příkazy vytvořené CommandBuilderem nebo DbDataAdapterem timeout nedostanou.
• DbConnector: providerName "System.Data.SqlClient" i "Microsoft.Data.SqlClient" (a prázdný providerName) je mapován na Microsoft.Data.SqlClient.SqlClientFactory, registrace v konfiguraci není nutná.
• Microsoft.Data.SqlClient má výchozí Encrypt=True (System.Data.SqlClient měl False). Při nedůvěryhodném certifikátu SQL Serveru je nutné v connection stringu uvést TrustServerCertificate=True, případně Encrypt=False.
• IntTable: používá Microsoft.Data.SqlClient.Server.SqlDataRecord. Hodnoty jsou streamovány přes jediný znovupoužitý SqlDataRecord (výrazně méně alokací a rychlejší pro tisíce a více hodnot).
• DataRecord: hodnoty jsou uloženy v poli, názvy sloupců v DataRecordSchema. Nový konstruktor DataRecord(IDataRecord, DataRecordSchema, DataLoadPower) umožňuje sdílet jedno schéma všemi řádky readeru (pro 1000 řádků ~50 % méně alokací, ~28 % rychlejší načtení). Změnil se tvar binárně serializovaného DataRecordu (dříve serializovaná data nelze deserializovat).
• SqlDatabaseTransientErrorDetectionStrategy rozpoznává pouze Microsoft.Data.SqlClient.SqlException.
• Explicitní závislost System.Security.Cryptography.Pkcs 10.0.13 - Microsoft.Data.SqlClient zatahuje zranitelnou verzi (CVE-2026-84008, CVE-2026-70162).