Skip to content

Do not close the inner reader when disposing wrapped data readers#2100

Merged
mgravell merged 1 commit intoDapperLib:mainfrom
0xced:DisposeNoThrow
Jul 3, 2024
Merged

Do not close the inner reader when disposing wrapped data readers#2100
mgravell merged 1 commit intoDapperLib:mainfrom
0xced:DisposeNoThrow

Conversation

@0xced
Copy link
Contributor

@0xced 0xced commented Jul 3, 2024

When disposing wrapped readers, only call Dispose() on the inner reader and let it catch exceptions if appropriate.

Note: this actually happened with Microsoft.Data.SqlClient.

Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): The wait operation timed out.
   at void Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, bool breakConnection, Action<Action> wrapCloseInAction)
   at void Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, bool callerHasConnectionLock, bool asyncClose)
   at bool Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, out bool dataReady)
   at bool Microsoft.Data.SqlClient.SqlDataReader.TryCloseInternal(bool closeReader)
   at void Microsoft.Data.SqlClient.SqlDataReader.Close()
   at void Dapper.DbWrappedReader.Dispose(bool disposing) in /_/Dapper/WrappedReader.cs:line 149
   at ValueTask System.Data.Common.DbDataReader.DisposeAsync()

When disposing wrapped readers, only call Dispose() on the inner reader and let it catch exceptions if appropriate.

Note: this actually happened with `Microsoft.Data.SqlClient`.

```
Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): The wait operation timed out.
   at void Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, bool breakConnection, Action<Action> wrapCloseInAction)
   at void Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, bool callerHasConnectionLock, bool asyncClose)
   at bool Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, out bool dataReady)
   at bool Microsoft.Data.SqlClient.SqlDataReader.TryCloseInternal(bool closeReader)
   at void Microsoft.Data.SqlClient.SqlDataReader.Close()
   at void Dapper.DbWrappedReader.Dispose(bool disposing) in /_/Dapper/WrappedReader.cs:line 149
   at ValueTask System.Data.Common.DbDataReader.DisposeAsync()
```
@mgravell
Copy link
Member

mgravell commented Jul 3, 2024

Seems fair; we can let the inner reader worry about what Dispose() means, since we're propagating Dispose(), not Close() + Dispose().

@mgravell
Copy link
Member

mgravell commented Jul 3, 2024

overriding appveyor, although the pgsql problem might prevent "main" deploy - that's not your problem, though; unrelated to this PR

@mgravell mgravell merged commit 9ed3525 into DapperLib:main Jul 3, 2024
@0xced 0xced deleted the DisposeNoThrow branch July 3, 2024 13:05
sloweyyy added a commit to sloweyyy/cloud-native-ecommerce-platform that referenced this pull request Mar 22, 2026
Updated [Dapper](https://github.com/DapperLib/Dapper) from 2.1.35 to
2.1.66.

<details>
<summary>Release notes</summary>

_Sourced from [Dapper's
releases](https://github.com/DapperLib/Dapper/releases)._

## 2.1.66

WARNING: `DateOnly` / `TimeOnly` support, added in 2.1.37, had multiple
failure modes, and was quickly reverted pending finding the time to
investigate what went wrong. The impacted packages were unlisted, with
2.1.35 being the last listed version. This is the first version *after*
that debacle, which means if you are using the impacted 2.1.37 or
similar: this version will effectively *remove* functionality (although
it was actually disabled a very long time ago).

---

## What's Changed
* TFM update; +net8 (LTS), -net5, -net7 by @​mgravell in
DapperLib/Dapper#2144
* normalize async API surface over all TFMs by @​mgravell in
DapperLib/Dapper#2144
* disable DateOnly / TimeOnly support by @​mgravell in
DapperLib/Dapper#2080
* change dapper-plus citation by @​mgravell in
DapperLib/Dapper#2083
* Do not close the inner reader when disposing wrapped data readers by
@​0xced in DapperLib/Dapper#2100
* CI - update pgsql to 13 by @​mgravell in
DapperLib/Dapper#2119
* Fix #​2113 by @​goerch in
DapperLib/Dapper#2118
* update package refs and fixup by @​mgravell in
DapperLib/Dapper#2120
* add mention of MariaDB to Readme.md by @​robertsilen in
DapperLib/Dapper#2116
* Improve performance of "queryunbuffered", and correctness of "first"
APIs by @​mgravell in DapperLib/Dapper#2121
* Properly handle value types when setting properties on dynamic objects
returned by Dapper queries by @​alatanza in
DapperLib/Dapper#2122
* Mark AddTypeHandlerImpl as obsolete and prevent lost updates via
AddTypeHandler by @​mgravell in
DapperLib/Dapper#2129
* Build: Update Postgres script by @​NickCraver in
DapperLib/Dapper#2130

## New Contributors
* @​goerch made their first contribution in
DapperLib/Dapper#2118
* @​robertsilen made their first contribution in
DapperLib/Dapper#2116
* @​alatanza made their first contribution in
DapperLib/Dapper#2122

**Full Changelog**:
DapperLib/Dapper@2.1.44...2.1.66

## 2.1.44

(fixes NuGet readme)

**Full Changelog**:
DapperLib/Dapper@2.1.42...2.1.44

## 2.1.42

## What's Changed

* revert #​2050 - see #​2049 for more details by @​mgravell in
DapperLib/Dapper#2070
* new sponsor: Dapper Plus by @​mgravell in
DapperLib/Dapper#2069

**Full Changelog**:
DapperLib/Dapper@2.1.37...2.1.42

## 2.1.37

## What's Changed
* string and byte[] : add UseGetFieldValue by @​mgravell in
DapperLib/Dapper#2050
* implement DateOnly/TimeOnly by @​mgravell in
DapperLib/Dapper#2051


**Full Changelog**:
DapperLib/Dapper@2.1.35...2.1.37

Commits viewable in [compare
view](DapperLib/Dapper@2.1.35...2.1.66).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Dapper&package-manager=nuget&previous-version=2.1.35&new-version=2.1.66)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants