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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Rabota.Data.SqlClientV2" Version="6.0.1.36" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Rabota.Data.SqlClientV2" Version="6.0.1.36" />
                    
Directory.Packages.props
<PackageReference Include="Rabota.Data.SqlClientV2" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Rabota.Data.SqlClientV2 --version 6.0.1.36
                    
#r "nuget: Rabota.Data.SqlClientV2, 6.0.1.36"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Rabota.Data.SqlClientV2@6.0.1.36
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Rabota.Data.SqlClientV2&version=6.0.1.36
                    
Install as a Cake Addin
#tool nuget:?package=Rabota.Data.SqlClientV2&version=6.0.1.36
                    
Install as a Cake Tool

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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