Rabota.Data.SqlClientV2
6.0.1.36
Requires NuGet 2.12 or higher.
dotnet add package Rabota.Data.SqlClientV2 --version 6.0.1.36
NuGet\Install-Package Rabota.Data.SqlClientV2 -Version 6.0.1.36
<PackageReference Include="Rabota.Data.SqlClientV2" Version="6.0.1.36" />
<PackageVersion Include="Rabota.Data.SqlClientV2" Version="6.0.1.36" />
<PackageReference Include="Rabota.Data.SqlClientV2" />
paket add Rabota.Data.SqlClientV2 --version 6.0.1.36
#r "nuget: Rabota.Data.SqlClientV2, 6.0.1.36"
#:package Rabota.Data.SqlClientV2@6.0.1.36
#addin nuget:?package=Rabota.Data.SqlClientV2&version=6.0.1.36
#tool nuget:?package=Rabota.Data.SqlClientV2&version=6.0.1.36
Rabota.SqlClient
Тут живет подхаченый форк Microsoft.Data.SqlClient библиотеки
how it works?
псевдокод:
# get library sources
git clone https://github.com/dotnet/SqlClient
git checkout tags/v5.2.2
# commentout unwanted code
sed s/tls_handshake.../\/\/ tls_handshake.../g -i src/path/to/Tds.cs
# packa and publish nuget package
dotnet pack
dotnet publish
versioning
все это дело запускается вручную (не предпологается что мы каждый день обновляем это дело)
при запуске мы явно указываем версию которую хотим подхачить (дело в том что мы наверное не хотим прям мастер каждый раз забирать, бо можем утянуть какие то не готовые кандидат релизы)
публикуемая версия будет иметь такой же номер плюс номер сборки в github
так например, если собираем для либы 5.2.2 то наш пакет будет иметь версию 5.2.2.42, где 42 это github build number
local testing
за для локальной проверки, делаем следующее
git clone https://github.com/dotnet/SqlClient
далее открываем повершел и забираем куски кода из workflow и прогоняем их убеждаясь что оно находит и комментит интересующие нас куски кода (git status будет показывать изменения)
$path = 'path/to/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs'
$content = Get-Content $path -Raw
$content = [regex]::Replace($content, 'SendPreLoginHandshake\([\s\S]+?\);', '// SendPreLoginHandshake(instanceName, encrypt, integratedSecurity, serverCertificateFilename);')
# ...
$content | Set-Content -Path $path
smoke test
для проверки боем нам нужно собрать и опубликовать свежу сборку запустив workflow и дождаться пока она появиться в nuget
затем в продовском кубере (обязательно продовский, бо там старая база с которой проблемы, в тестовых все будет работать и без этих хаков) делаем вот так:
kubectl run mactemp --rm -it --image ubuntu -- bash
далее, внтури поды следующее:
apt update
apt install -y dotnet-sdk-8.0 # со временем устареет
mkdir ~/mactemp
cd ~/mactemp
dotnet new console
dotnet add package Rabota.Data.SqlClient --version 5.2.2.25 # CHANGE_ME
cat <<EOT > Program.cs
using Microsoft.Data.SqlClient;
using var con = new SqlConnection("...CHANGE_ME...");
con.Open();
using var cmd = con.CreateCommand();
cmd.CommandText = "SELECT TOP 3 Id, Name FROM City";
var reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["Id"] + ": " + reader["Name"]);
}
EOT
dotnet run
Примечание: после публикации пакета проходит от пяти до десяти минут прежде чем он появиться в nuget, т.к. с одной стороны кэши, а с другой, там еще пакет проходит "валидацию"
В случае успеха увидим коротенький список городов
Далее просто выполняем команду exit кубер сам почистити и удалит поду
Все, готово, можно принимать поздравление с публикацией новой версии
Исторический контекст
Где то до ковида, когда делали самые первые шаги в докеры, куберы, сервисы и т.п. буквально сразу же обламались - технически не возможно ходить из сервиса бегущего в свежих линуксах в старую базу
Глубоко под капотом оно завязано на TLS handshake, а как следствие, поверх еще и истории с тем что всякие TLS1.0 уже давным давно нигде не работают, а старая база другие, более свежие еще не умеет
В общем замкнутый круг и мы оказались у разбитого корыта, когда можно было бы опустить руки и сказать - ну все, приехали, остаемся с веб формами, jquery и sql 2005 🤷♂️
Hack The Library
Какая идея и как это все происходило
Ставим полноценную Ubuntu Desktop, всякие там VPN и т.п. что бы она могла достучаться до продовской базы, ставим туда Rider, выкачиваем исходники либы, делаем демо прилоежние и начинаем муторно его дебажить, шаг за шагом пробираясь сквозь дебри либы пока не разберемся на каком именно этапе происходит этот handshake
Далее, не от хорошей жизни и не имея особо опций, просто закоменчиваем его и внезапно все заводиться
FAQ
Почему хачим Microsoft.Data.SqlClient, а не System.Data.SqlClient?
Кануло в лету, сейчас уже не получиться ответить на этот вопрос, изначально, зацепились именно за Microsoft, т.к. с System путаница и не ясно что и как будет когда он предустановлен в рантайме
Зачем мы обновляем эту либу, ведь SQL 2005 уже не обновляется и не поддерживается?
Так и есть, и оно какое то время так и было, но потом вылезла новая вводная - чем дальше, тем больше мы пользуем Entity Framework, а он хочет более свежие версии, из-за чего мы вынуждены обновлять это дело в след за обновлениями EF
Не будет ли Microsoft ругаться что мы такое делаем?
Нет, единственное что они вышли на связь и попросили всюду добавить дисклеймеры что это не библиотека Microsoft
History
v1
Изначально завели форк либы в github.com/rabotaua/SqlClient, в этом форке добавили свой github action который вытянув исходники, закоменчивал искомые строки, а далее собирал nuget пакет, который затем публиковался в nuget.org
В целом оно работало, НО, есть один ньюанс - форк и его обновление - может оказаться проблемой, так у нас пролезли не совсем удачные комиты, называется сам не доглядель, из-за которых последующее обновление форка было бы порталом в ад с бесконечными конфликтами
v1.1
Дальше вылезла необходимость сделать похожый хак только для виндовой сборки - именно начиная с того момента github action разросся и переехал на виндовую машинку и потому оно крепко завязано на это дело
v1.2
С очередным изменением в исходниках поменялось форматирование, от чего поломались скрипты комментирующие код
v2
В этом репо все устроено другим образом - мы отказываемся от форка как такового, т.к. он нам по сути то и не нужен
Берем yaml из v1 и просто добавляем первым шагом вычитку репозитория с исходниками
И под шумок, в самом конце, публикацю пакета в nuget.org, дабы не нужно было этого делать руками
Тем самым раз и на всегда закрывая вопрос с форками и их апдейтами, а так же, под шумок, пользуем регулярки, дабы чуть легче переживать изменения форматирования
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Framework | net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETFramework 4.6.2
- Azure.Identity (>= 1.11.4)
- Microsoft.Bcl.Cryptography (>= 8.0.0)
- Microsoft.Data.SqlClient.SNI (>= 6.0.2)
- Microsoft.Extensions.Caching.Memory (>= 8.0.1)
- Microsoft.IdentityModel.JsonWebTokens (>= 7.5.0)
- Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 7.5.0)
- System.Buffers (>= 4.5.1)
- System.Security.Cryptography.Pkcs (>= 8.0.1)
- System.Text.Encodings.Web (>= 6.0.0)
- System.Text.Json (>= 6.0.10)
-
net8.0
- Azure.Identity (>= 1.11.4)
- Microsoft.Bcl.Cryptography (>= 8.0.0)
- Microsoft.Data.SqlClient.SNI.runtime (>= 6.0.2)
- Microsoft.Extensions.Caching.Memory (>= 8.0.1)
- Microsoft.IdentityModel.JsonWebTokens (>= 7.5.0)
- Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 7.5.0)
- Microsoft.SqlServer.Server (>= 1.0.0)
- System.Configuration.ConfigurationManager (>= 8.0.1)
- System.Security.Cryptography.Pkcs (>= 8.0.1)
-
net9.0
- Azure.Identity (>= 1.11.4)
- Microsoft.Bcl.Cryptography (>= 9.0.0)
- Microsoft.Data.SqlClient.SNI.runtime (>= 6.0.2)
- Microsoft.Extensions.Caching.Memory (>= 9.0.0)
- Microsoft.IdentityModel.JsonWebTokens (>= 7.5.0)
- Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 7.5.0)
- Microsoft.SqlServer.Server (>= 1.0.0)
- System.Configuration.ConfigurationManager (>= 9.0.0)
- System.Security.Cryptography.Pkcs (>= 9.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 6.0.1.36 | 118 | 2/20/2026 |