Open danmoseley opened 7 years ago
CC @saurabh500 @geleems
SqlBulkCopy WriteToServer* methods are being added in this PR: https://github.com/dotnet/corefx/pull/16884
Hit this omission when trying to convert the desktop build of https://github.com/StackExchange/Dapper (one of the top 100 nuget libraries);
M:System.Data.SqlClient.SqlParameter.set_UdtTypeName(System.String)
@danmosemsft Does this report only show the missing methods of existing types common to Core and Desktop ? I dont see a few types which are missing like SqlCommandBuilder
@saurabh500 you can see the full diff between (selected part of) Desktop and Core in this file.
https://github.com/dotnet/corefx/blob/master/src/shims/ApiCompatBaseline.netcoreapp.netfx461.txt
In the list above, I've only looked at missing members. Missing Types are generally not as interesting as explained above -- we can in theory add them separately. Certainly it would be great to bring back many of those missing types, perhaps driven by our usage data, user reports, conversion experiences, etc.
In fact, given this is now post 2.0, I'd say members and types are equally interesting.
Update from today, 65 missing members (instead of 75 from above):
UPDATE: Original list replaced by newer one at the top of the thread!
MembersMustExist : Member 'Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String, System.Boolean, System.Boolean, System.Data.SqlClient.SortOrder, System.Int32)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'Microsoft.SqlServer.Server.SqlMetaData.DbType.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'Microsoft.SqlServer.Server.SqlMetaData.Type.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.Common.DbProviderFactory.CreatePermission(System.Security.Permissions.PermissionState)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.Odbc.OdbcConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.Odbc.OdbcFactory.CreatePermission(System.Security.Permissions.PermissionState)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopyOptions System.Data.SqlClient.SqlBulkCopyOptions.AllowEncryptedValueModifications' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlClientFactory.CreatePermission(System.Security.Permissions.PermissionState)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand..ctor(System.String, System.Data.SqlClient.SqlConnection, System.Data.SqlClient.SqlTransaction, System.Data.SqlClient.SqlCommandColumnEncryptionSetting)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery(System.AsyncCallback, System.Object)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteReader()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback, System.Object)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback, System.Object, System.Data.CommandBehavior)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.Data.CommandBehavior)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(System.AsyncCallback, System.Object)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.ColumnEncryptionSetting.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(System.IAsyncResult)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.EndExecuteReader(System.IAsyncResult)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(System.IAsyncResult)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.Notification.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.Notification.set(System.Data.Sql.SqlNotificationRequest)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.NotificationAutoEnlist.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.NotificationAutoEnlist.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlCommand.ResetCommandTimeout()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection..ctor(System.String, System.Data.SqlClient.SqlCredential)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.AccessToken.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.AccessToken.set(System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.ChangePassword(System.String, System.Data.SqlClient.SqlCredential, System.Security.SecureString)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.ChangePassword(System.String, System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.Credential.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.Credential.set(System.Data.SqlClient.SqlCredential)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(System.Collections.Generic.IDictionary<System.String, System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider>)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.Authentication.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.Authentication.set(System.Data.SqlClient.SqlAuthenticationMethod)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting.set(System.Data.SqlClient.SqlConnectionColumnEncryptionSetting)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.Enlist.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.Enlist.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary.set(System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.TransactionBinding.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.TransactionBinding.set(System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlDataReader.IsCommandBehavior(System.Data.CommandBehavior)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter..ctor(System.String, System.Data.SqlDbType, System.Int32, System.Data.ParameterDirection, System.Boolean, System.Byte, System.Byte, System.String, System.Data.DataRowVersion, System.Object)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter..ctor(System.String, System.Data.SqlDbType, System.Int32, System.Data.ParameterDirection, System.Byte, System.Byte, System.String, System.Data.DataRowVersion, System.Boolean, System.Object, System.String, System.String, System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter.ForceColumnEncryption.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter.ForceColumnEncryption.set(System.Boolean)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter.UdtTypeName.get()' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameter.UdtTypeName.set(System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameterCollection.Add(System.String, System.Data.SqlDbType, System.Int32, System.String)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'System.Data.SqlClient.SqlParameterCollection.Add(System.String, System.Object)' does not exist in the implementation but it does exist in the contract.
Here is the full list including types of API that's in SqlClient on desktop but not on Core. Would we aspire to port all these?
UPDATE: List moved to top-post
UdtTypeName
is a blocker for Dapper to add UDTs back in, I just hit this trying to do a netstandard2.0 build.
UdtTypeName
seems to be weird unsupported one-off among list of supported values (per offline info from @NickCraver). It leads to runtime exception instead of compile time failure in certain use cases, e.g. here. It is the only unsupported option from this enum.
@saurabh500 @corivera @divega is it something we should add into Core 2.0? If not, we need to document all throwing places in API compat at minimum. We should probably create separate bug tracking it ... so that we can decide & if rejected, track adding the compat entry. Thoughts?
Here are the members missing from Core that are overrides. I didn't list them above as they're not relevant to API compat. However, when they're missing it can suggest implementation is missing.
UPDATE: List moved to top-post
The lists above are large enough that we should basically consider SqlClient incomplete and decide whether we want it to be complete (or if not exactly which part is supported) rather than adding in API piecewise from these lists.
I went through these vs. reference source, can nuke these from the list (they aren't overridden in NetFx):
M:System.Data.SqlClient.SqlConnection.EnlistTransaction(System.Transactions.Transaction)
P:System.Data.SqlClient.SqlParameter.SourceVersion
P:System.Data.SqlClient.SqlParameterCollection.IsFixedSize
P:System.Data.SqlClient.SqlParameterCollection.IsReadOnly
P:System.Data.SqlClient.SqlParameterCollection.IsSynchronized
Can also remove M:System.Data.SqlClient.SqlClientFactory.CreateDataAdapter
- it landed a few days ago in https://github.com/dotnet/corefx/commit/88f562c80d8d78218ccc7b4be8b23ceab712a5f6
I updated all the lists and merged them into master list in top post with help from @ViktorHofer. Thanks @NickCraver for verification!
AFAIR, T:System.Data.SqlClient.SqlProviderServices
is defined in System.Data.Entity.dll in .NET Framework even if it is part of the SqlClient namespace. It is part of the EF provider model for old versions of EF that were part of .NET Framework. I don't think it makes sense to have it in this list.
@karelz @danmosemsft is there a similar list for System.Data.Common or are those APIs complete?
@divega's API moved into "By Design missing" section. @ViktorHofer @danmosemsft can help create similar list for other namespaces.
All other members/types missing:
M:Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type)
M:Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String)
M:Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String, System.Boolean, System.Boolean, System.Data.SqlClient.SortOrder, System.Int32)
P:Microsoft.SqlServer.Server.SqlMetaData.DbType {get;}
P:Microsoft.SqlServer.Server.SqlMetaData.Type {get;}
M:System.Data.Common.DbProviderFactory.CreatePermission(System.Security.Permissions.PermissionState)
M:System.Data.Odbc.OdbcConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)
M:System.Data.Odbc.OdbcFactory.CreatePermission(System.Security.Permissions.PermissionState)
TypesMustExist : Type 'Microsoft.SqlServer.Server.DataAccessKind' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.Format' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.IBinarySerialize' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.InvalidUdtException' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlContext' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlFacetAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlFunctionAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlMethodAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlPipe' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlProcedureAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlTriggerAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlTriggerContext' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlUserDefinedAggregateAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.SystemDataAccessKind' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'Microsoft.SqlServer.Server.TriggerAction' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.DataSetSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.PropertyAttributes' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.TypedDataSetGenerator' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.TypedDataSetGeneratorException' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.Common.DbProviderConfigurationHandler' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.Common.DbProviderFactories' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.Common.DbProviderFactoriesConfigurationHandler' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbCommand' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbCommandBuilder' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbConnection' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbConnectionStringBuilder' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbDataAdapter' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbDataReader' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbEnumerator' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbError' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbErrorCollection' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbException' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbFactory' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbInfoMessageEventArgs' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbInfoMessageEventHandler' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbLiteral' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbMetaDataCollectionNames' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbMetaDataColumnNames' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbParameter' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbParameterCollection' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbRowUpdatedEventArgs' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbRowUpdatedEventHandler' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbRowUpdatingEventArgs' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbRowUpdatingEventHandler' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbSchemaGuid' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbTransaction' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.OleDb.OleDbType' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.Sql.SqlDataSourceEnumerator' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.Sql.SqlNotificationRequest' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.SqlFileStream' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.SqlTypesSchemaImporterExtensionHelper' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeBigIntSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeBinarySchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeBitSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeCharSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeDateTimeSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeDecimalSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeFloatSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeIntSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeMoneySchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeNCharSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeNTextSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeNumericSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeNVarCharSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeRealSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeSmallDateTimeSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeSmallIntSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeSmallMoneySchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeTextSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeTinyIntSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeUniqueIdentifierSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeVarBinarySchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeVarCharSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
TypesMustExist : Type 'System.Data.SqlTypes.TypeVarImageSchemaImporterExtension' does not exist in the implementation but it does exist in the contract.
@ViktorHofer just to make sure, are you saying this list + the list at the top are the full API diff?
From what I know, the whole of System.Data.Odbc is still missing (although the code was ported, I believe we are not producing the package).
It might help me understand if I knew exactly are you diffing and excluding.
I updated the above list. This should now be the full diff between netcoreapp20 and netfx461. Please excuse the mixed formatting.
We ignored TypesMustExist errors in other namespaces as they weren't goal NS2.0. You can find the diff which I posted above checked in here:
This is the raw output we use for our validation.
I have created a Gist, categorizing the buckets/scenarios for most of the Types/Methods/Properties which are missing. I am going by the list in the original issue at top. I will be refining the ones at the bottom of my gist .
https://gist.github.com/saurabh500/011e90da4ac77d879ea74980fa6fcfae
how about giving this SqlClient implementation a tfm of netcoreapp2.0 instead of netstandard2.0, so that people don't accidentally try to use the less-capable one on netfx and get runtime errors?
The netstandard20 surface is implemented, this issue is about differences between netcoreapp20 and netfx461 which doesn't necessarily mean we need to support all of them but for compatibility reasons it makes sense to support as many as possible. We have some APIs which were left out intentionally as they don't make sense in Core.
@gulbanana do you mean that SqlClient targets netcoreapp20 instead of netstandard2.0? netstandard20 should be prefer choice in such case to provide same API surface and implementation across all runtimes (Desktop & .NET Core & Mono & UWP). It is useful for "portable" .NET Standard-based libraries.
the trouble is that it is not the same api surface. desktop and mono already have access to a version with more api, and people will not realise that - they'll switch to the netstandard version thinking it is the same or better, then get runtime errors due to behaviour differences. they may even know better, but have this switch forced on them by dependencies which get ported to netstandard instead of cross-targeting - the exact thing you want to encourage becomes a risk similar to what happened with httpclient.
certainly the eventual future is a single netstandard implementation, but i'm worried about this interim period where the newest available-to-desktop version is a potentially-silent regression of functionality. don't the same principles that led to "bring back all members of a type, or none" in the rest of corefx apply here?
I'd really like to use one of the unported items on the thread here, namely
System.Data.SqlClient.SqlParameter..ctor(System.String, System.Data.SqlDbType, System.Int32, System.Data.ParameterDirection, System.Boolean, System.Byte, System.Byte, System.String, System.Data.DataRowVersion, System.Object)
but I'd also be willing to help with some of the additional port work as well.
Would it be appropriate to make a PR for some of the items in this issue, or at least just the constructor I need?
@corivera is the area owner, but if you're filling in holes on existing types, I am sure he would welcome such PR's. You can get code from our reference source. It will need cleanup to coding style, and tests for it. Perhaps you could complete SqlParameter at least?
As mentioned above, https://github.com/dotnet/corefx/blob/master/src/shims/ApiCompatBaseline.netcoreapp.netfx461.txt should contain the current list of omissions.
Thanks @joelbraun for your contribution! Just curious: Do you plan to add back more members later, or just the one in PR #23787?
I sent you collaborator invite, just in case, so that we can assign the issue to you (GitHub limitation), if you want to continue working on it. Once you accept, you will be subscribed to all CoreFX notifications - I suggest to disable them to avoid being DOS'd (there's plenty of them - 500+ daily). For contributions, please check out our docs on main page - they are currently hosted on wiki, so it is super-simple to edit them. Please do so if you find things missing / unclear / incorrect. Thanks!
@saurabh500 @corivera @divega I'd love to see us finish off this surface area in 2.1. It keeps coming up and it's not a good story to have an incomplete library.
Do you know of any technical reasons making this difficult - is it just resourcing? Do you need help? Do you already have plans for any of these types?
+1 to add System.Data.SqlTypes.SqlFileStream
.
Has anyone found a workaround for reading file streams from the database?
Here's an updated list - some of them have been ported since. I just looked for "Sql":
System.Data.Sql.SqlDataSourceEnumerator
System.Data.SqlClient.SqlAuthenticationMethod
System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider
System.Data.SqlClient.SqlColumnEncryptionCngProvider
System.Data.SqlClient.SqlColumnEncryptionCspProvider
System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider
System.Data.SqlClient.SqlCommandColumnEncryptionSetting
System.Data.SqlClient.SqlConnectionColumnEncryptionSetting
System.Data.SqlClient.SqlCredential
System.Data.SqlClient.SQLDebugging
System.Data.SqlTypes.SqlFileStream
System.Data.SqlTypes.SqlTypesSchemaImporterExtensionHelper
System.Data.SqlTypes.TypeBigIntSchemaImporterExtension
System.Data.SqlTypes.TypeBinarySchemaImporterExtension
System.Data.SqlTypes.TypeBitSchemaImporterExtension
System.Data.SqlTypes.TypeCharSchemaImporterExtension
System.Data.SqlTypes.TypeDateTimeSchemaImporterExtension
System.Data.SqlTypes.TypeDecimalSchemaImporterExtension
System.Data.SqlTypes.TypeFloatSchemaImporterExtension
System.Data.SqlTypes.TypeIntSchemaImporterExtension
System.Data.SqlTypes.TypeMoneySchemaImporterExtension
System.Data.SqlTypes.TypeNCharSchemaImporterExtension
System.Data.SqlTypes.TypeNTextSchemaImporterExtension
System.Data.SqlTypes.TypeNumericSchemaImporterExtension
System.Data.SqlTypes.TypeNVarCharSchemaImporterExtension
System.Data.SqlTypes.TypeRealSchemaImporterExtension
System.Data.SqlTypes.TypeSmallDateTimeSchemaImporterExtension
System.Data.SqlTypes.TypeSmallIntSchemaImporterExtension
System.Data.SqlTypes.TypeSmallMoneySchemaImporterExtension
System.Data.SqlTypes.TypeTextSchemaImporterExtension
System.Data.SqlTypes.TypeTinyIntSchemaImporterExtension
System.Data.SqlTypes.TypeUniqueIdentifierSchemaImporterExtension
System.Data.SqlTypes.TypeVarBinarySchemaImporterExtension
System.Data.SqlTypes.TypeVarCharSchemaImporterExtension
System.Data.SqlTypes.TypeVarImageSchemaImporterExtension
Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type)
Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String)
Microsoft.SqlServer.Server.SqlMetaData..ctor(System.String, System.Data.SqlDbType, System.Type, System.String, System.Boolean, System.Boolean, System.Data.SqlClient.SortOrder, System.Int32)
System.Data.SqlClient.SqlBulkCopyOptions System.Data.SqlClient.SqlBulkCopyOptions.AllowEncryptedValueModifications
System.Data.SqlClient.SqlClientFactory.CreatePermission(System.Security.Permissions.PermissionState)
System.Data.SqlClient.SqlCommand..ctor(System.String, System.Data.SqlClient.SqlConnection, System.Data.SqlClient.SqlTransaction, System.Data.SqlClient.SqlCommandColumnEncryptionSetting)
System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery()
System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery(System.AsyncCallback, System.Object)
System.Data.SqlClient.SqlCommand.BeginExecuteReader()
System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback, System.Object)
System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback, System.Object, System.Data.CommandBehavior)
System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.Data.CommandBehavior)
System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader()
System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(System.AsyncCallback, System.Object)
System.Data.SqlClient.SqlCommand.ColumnEncryptionSetting.get()
System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(System.IAsyncResult)
System.Data.SqlClient.SqlCommand.EndExecuteReader(System.IAsyncResult)
System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(System.IAsyncResult)
System.Data.SqlClient.SqlCommand.NotificationAutoEnlist.get()
System.Data.SqlClient.SqlCommand.NotificationAutoEnlist.set(System.Boolean)
System.Data.SqlClient.SqlConnection..ctor(System.String, System.Data.SqlClient.SqlCredential)
System.Data.SqlClient.SqlConnection.AccessToken.get()
System.Data.SqlClient.SqlConnection.AccessToken.set(System.String)
System.Data.SqlClient.SqlConnection.ChangePassword(System.String, System.Data.SqlClient.SqlCredential, System.Security.SecureString)
System.Data.SqlClient.SqlConnection.ChangePassword(System.String, System.String)
System.Data.SqlClient.SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.get()
System.Data.SqlClient.SqlConnection.Credential.get()
System.Data.SqlClient.SqlConnection.Credential.set(System.Data.SqlClient.SqlCredential)
System.Data.SqlClient.SqlConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)
System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(System.Collections.Generic.IDictionary<System.String, System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider>)
System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing.get()
System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing.set(System.Boolean)
System.Data.SqlClient.SqlConnectionStringBuilder.Authentication.get()
System.Data.SqlClient.SqlConnectionStringBuilder.Authentication.set(System.Data.SqlClient.SqlAuthenticationMethod)
System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting.get()
System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting.set(System.Data.SqlClient.SqlConnectionColumnEncryptionSetting)
System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset.get()
System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset.set(System.Boolean)
System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection.get()
System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection.set(System.Boolean)
System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary.get()
System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary.set(System.String)
System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution.get()
System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution.set(System.Boolean)
System.Data.SqlClient.SqlDataReader.IsCommandBehavior(System.Data.CommandBehavior)
System.Data.SqlClient.SqlParameter.ForceColumnEncryption.get()
System.Data.SqlClient.SqlParameter.ForceColumnEncryption.set(System.Boolean)
System.Data.SqlClient.SqlParameterCollection.Add(System.String, System.Object)
@saurabh500 is currently doing 2.1 planning so we should have more detail soon.
Hi all, I did a PR for a constructor off this list a few months back and I'd be willing to help out with some more of the work here. I've looked over some of the items off this list and it seems like a good number of them are just method overloads or items that can be pulled from reference source. If it sounds OK I can do some more on this (tests and all, of course- which should help with #14346).
@joelbraun that sounds great. @saurabh500 which part should he tackle? (I wouldn't wait for this though)
Sounds good - this is more related to the testing side, but as discussed on #14346 if there are any internal netfx tests that can be made available for these it'd be nice. No problem if not, I can look at Mono's stuff or write my own.
@saurabh500 do you have 2.1 plans to share, that would help separate what your team plans to do here and where community contributions would be welcomed?
Also are there any internal tests that @joelbraun and others can reuse?
For any community contributions, I would say following are a good place to start. Some of these APIs are already available and need to be made public. Example PR to accomplish such tasks is https://github.com/dotnet/corefx/pull/26016
M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback,System.Object)
M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.AsyncCallback,System.Object,System.Data.CommandBehavior)
M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(System.Data.CommandBehavior)
M:System.Data.SqlClient.SqlCommand.EndExecuteReader(System.IAsyncResult)
M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader
M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(System.AsyncCallback,System.Object)
M:System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(System.IAsyncResult)
@saurabh500 @danmosemsft Funnily enough, that's where I decided to get started. Almost done with those - I should have a PR up in a few days.
@joelbraun Thanks for the PR. Do you want to take on more APIs ?
@saurabh500 Sure, what would you like me to take a look at next?
@joelbraun Would you be interested in taking up SqlCredential?
M:System.Data.SqlClient.SqlConnection.#ctor(System.String,System.Data.SqlClient.SqlCredential)
P:System.Data.SqlClient.SqlConnection.CredentialM:System.Data.SqlClient.SqlConnection.ChangePassword(System.String,System.Data.SqlClient.SqlCredential,System.Security.SecureString)
M:System.Data.SqlClient.SqlConnection.ChangePassword(System.String,System.String)
T:System.Data.SqlClient.SqlCredential
The above APIs need to be brought in. This can be done in phases, first by adding SqlCredential type and then working on the APIs which depend on the SqlCredential. If you are interested, I could open another issue and assign to you.
@saurabh500 Sounds like a plan to me, I'll take a look at those and get started.
@joelbraun The issue for the type SqlCredential is at https://github.com/dotnet/corefx/issues/11542
I’m not able to use SqlHierarchyId because IBinarySerialize is missing.
Anybody has a solution? or it just doesn’t work yet?
I just ran into this with SqlFacetAttribute
(on an SqlFunction
). Is implementing that planned / are you looking for pull requests?
System.Data.SqlClient.SqlBulkCopy.Dispose
is also missing. Painful.
I'm getting errors in trying to port code to .NET Standard 2.0 saying that System.Data.SqlClient.SqlTransaction
is not available, however, I don't see it on any of the above lists.
Can someone confirm if it is indeed missing from .NET Standard 2.0?
@MgSam is it not part of .NET Standard 2.0 itself, however it is implemented in a package that is .NET Standard 2.0 compatible. This is a great site to see where something is available: https://apisof.net/catalog/System.Data.SqlClient.SqlTransaction Here is the package: https://www.nuget.org/packages/System.Data.SqlClient/4.6.0-preview3-27014-02
The following members are on types implemented in .NET Core. However these particular members are missing, although they are present on Desktop.
The problem with this situation is
No work is necessarily required here for 2.0. It's not part of NS2.0. I didn't look at usage data. I'm just flagging this so we're doing this consciously.
[benrr101] Updating in 2024, note that SqlClient is now Microsoft.Data.SqlClient
Missing APIs List (as of 04/03/2024)
T:System.Data.SqlClient.OnChangeEventHandler
~ - Added circa 04/2020T:System.Data.SqlClient.PoolBlockingPeriod
~ - Added circa 06/2020T:System.Data.SqlClient.SqlAuthenticationMethod
~ - Added circa 08/2019M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.Clear
~ - Added circa 10/2021M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.RemoveAt(Int32)
~ - Added circa 10/2021F:System.Data.SqlClient.SqlBulkCopyOptions.AllowEncryptedValueModifications
~ - Added circa 04/2020M:System.Data.SqlClient.SqlClientFactory.GetService(Type)
M:System.Data.SqlClient.SqlClientFactory.CreateCommandBuilder
~ - Added 08/2019M:System.Data.SqlClient.SqlClientFactory.CreateDataSourceEnumerator
~M:System.Data.SqlClient.SqlClientFactory.CreatePermission(PermissionState)
P:System.Data.SqlClient.SqlClientFactory.CanCreateDataSourceEnumerator
~M:System.Data.SqlClient.SqlClientPermission.Add(String,String,KeyRestrictionBehavior)
M:System.Data.SqlClient.SqlClientPermission.Copy
M:System.Data.SqlClient.SqlClientPermissionAttribute.CreatePermission
T:System.Data.SqlClient.SqlClientMetaDataCollectionNames
~ - Added circa 09/2021T:System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider
~ - Added circa 08/2019T:System.Data.SqlClient.SqlColumnEncryptionCngProvider
~ - Added circa 08/2019T:System.Data.SqlClient.SqlColumnEncryptionCspProvider
~ - Added circa 08/2019T:System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider
~ - Added circa 04/2020P:System.Data.SqlClient.SqlCommand.ColumnEncryptionSetting
~ - Added circa 08/2019P:System.Data.SqlClient.SqlCommand.Notification
~ - Added circa 08/2019P:System.Data.SqlClient.SqlCommand.NotificationAutoEnlist
M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery
~ - Added circa 01/2021M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery(AsyncCallback,Object)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.BeginExecuteReader
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(AsyncCallback,Object)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(AsyncCallback,Object,CommandBehavior)
~ - Added circa 03/2020M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(CommandBehavior)
~ - Added circa 01/2021M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(AsyncCallback,Object)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult)
~ - Added circa 03/2020M:System.Data.SqlClient.SqlCommand.EndExecuteReader(IAsyncResult)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(IAsyncResult)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlCommand.ResetCommandTimeout
~ - Added circa 08/2019T:System.Data.SqlClient.SqlCommandBuilder
~ - Added circa 10/2021T:System.Data.SqlClient.SqlCommandColumnEncryptionSetting
~ - Added circa 04/2022M:System.Data.SqlClient.SqlConnection.#ctor(String,SqlCredential)
~ - Added circa 08/2019P:System.Data.SqlClient.SqlSonnection.AccessToken
~ - Added circa 08/2019P:System.Data.SqlClient.SqlConnection.ColumnEncryptionKeyCacheTtl
~ - Added circa 08/2019P:System.Data.SqlClient.SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled
~ - Added circa 08/2019P:System.Data.SqlClient.SqlConnection.ColumnEncryptionTrustedMasterKeyPaths
~ - Added circa 08/2019P:System.Data.SqlClient.SqlConnection.Credential
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.ChangePassword(String,SqlCredential,SecureString)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.ChangePassword(String,String)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)
M:System.Data.SqlClient.SqlConnection.GetSchema
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.GetSchema(String)
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.GetSchema(String,String[])
~ - Added circa 08/2019M:System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(IDictionary{String,SqlColumnEncryptionKeyStoreProvider})
~ - Added circa 08/2019T:System.Data.SqlClient.SqlConnectionColumnEncryptionSetting
~ - Added circa 04/2022P:System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing
~ - Removed from netfxP:System.Data.SqlClient.SqlConnectionStringBuilder.Authentication
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset
~ - Obsolete in netfxP:System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection
~ - Obsolete in netfxP:System.Data.SqlClient.SqlConnectionStringBuilder.Enlist
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.IsFixedSize
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary
P:System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.TransactionBinding
~ - Added circa 10/2021P:System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution
T:System.Data.SqlClient.SqlCredential
~ - Added circa 08/2019P:System.Data.SqlClient.SqlDataAdapter.UpdateBatchSize
~ - Added circa 10/2021M:System.Data.SqlClient.SqlDataReader.Close
~ - Added circa 08/2019M:System.Data.SqlClient.SqlDataReader.GetData(Int32)
~M:System.Data.SqlClient.SqlDataReader.GetSchemaTable
~ - Added circa 08/2019M:System.Data.SqlClient.SqlDataReader.IsCommandBehavior(CommandBehavior)
~ - Added circa 08/2019T:System.Data.SqlClient.SQLDebugging
T:System.Data.SqlClient.SqlDependency
~ - Added circa 10/2021T:System.Data.SqlClient.SqlNotificationEventArgs
~ - Added circa 10/2021T:System.Data.SqlClient.SqlNotificationInfo
~ - Added circa 04/2020T:System.Data.SqlClient.SqlNotificationType
~ - Added circa 04/2020M:System.Data.SqlClient.SqlParameter.#ctor(String,SqlDbType,Int32,ParameterDirection,Boolean,Byte,Bute,String,DataRowVersion,Object)
~ - Added circa 03/2021M:System.Data.SqlClient.SqlParameter.#ctor(String,SqlDbType,Int32,ParameterDirection,Byte,Byte,String,DataRowVersion,Boolean,Object,String,String,String)
~ - Added circa 06/2022M:System.Data.SqlClient.SqlParameter.ForceColumnEncryption
~ - Added circa 06/2022M:System.Data.SqlClient.SqlParameter.UdtTypeName
~ - Added circa 03/2021M:System.Data.SqlClient.SqlParameterCollection.Add(String,Object)
~ - Removed from netfxM:System.Data.SqlClient.SqlParameterCollection.Add(String,SqlDbType,Int32,String)
~ - Added circa 03/2021Old Missing APIs List
from https://github.com/dotnet/corefx/blob/master/src/shims/ApiCompatBaseline.netcoreapp.netfx461.txt