dotnet / SqlClient

Microsoft.Data.SqlClient provides database connectivity to SQL Server for .NET applications.
MIT License
851 stars 286 forks source link

SqlClient implementation and API is not complete in Core #17

Open danmoseley opened 7 years ago

danmoseley commented 7 years ago

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)


Old Missing APIs List

**Updated lists to reflect current status (5/15):** ### Missing APIs ``` T:System.Data.SqlClient.OnChangeEventHandler T:System.Data.SqlClient.PoolBlockingPeriod T:System.Data.SqlClient.SqlAuthenticationMethod M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.Clear M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.RemoveAt(System.Int32) F:System.Data.SqlClient.SqlBulkCopyOptions.AllowEncryptedValueModifications M:System.Data.SqlClient.SqlClientFactory.System#IServiceProvider#GetService(System.Type) T:System.Data.SqlClient.SqlClientMetaDataCollectionNames T:System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider T:System.Data.SqlClient.SqlColumnEncryptionCngProvider T:System.Data.SqlClient.SqlColumnEncryptionCspProvider T:System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider P:System.Data.SqlClient.SqlCommand.ColumnEncryptionSetting P:System.Data.SqlClient.SqlCommand.Notification P:System.Data.SqlClient.SqlCommand.NotificationAutoEnlist M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery(System.AsyncCallback,System.Object) M:System.Data.SqlClient.SqlCommand.BeginExecuteReader 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.BeginExecuteXmlReader M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(System.AsyncCallback,System.Object) M:System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(System.IAsyncResult) M:System.Data.SqlClient.SqlCommand.EndExecuteReader(System.IAsyncResult) M:System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(System.IAsyncResult) M:System.Data.SqlClient.SqlCommand.ResetCommandTimeout T:System.Data.SqlClient.SqlCommandBuilder T:System.Data.SqlClient.SqlCommandColumnEncryptionSetting M:System.Data.SqlClient.SqlConnection.#ctor(System.String,System.Data.SqlClient.SqlCredential) P:System.Data.SqlClient.SqlConnection.AccessToken P:System.Data.SqlClient.SqlConnection.ColumnEncryptionKeyCacheTtl P:System.Data.SqlClient.SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled P:System.Data.SqlClient.SqlConnection.ColumnEncryptionTrustedMasterKeyPaths P:System.Data.SqlClient.SqlConnection.Credential M:System.Data.SqlClient.SqlConnection.ChangePassword(System.String,System.Data.SqlClient.SqlCredential,System.Security.SecureString) M:System.Data.SqlClient.SqlConnection.ChangePassword(System.String,System.String) M:System.Data.SqlClient.SqlConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction) M:System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(System.Collections.Generic.IDictionary{System.String,System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider}) T:System.Data.SqlClient.SqlConnectionColumnEncryptionSetting P:System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing P:System.Data.SqlClient.SqlConnectionStringBuilder.Authentication P:System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting P:System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset P:System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection P:System.Data.SqlClient.SqlConnectionStringBuilder.Enlist P:System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary P:System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod P:System.Data.SqlClient.SqlConnectionStringBuilder.TransactionBinding P:System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution T:System.Data.SqlClient.SqlCredential M:System.Data.SqlClient.SqlDataReader.IsCommandBehavior(System.Data.CommandBehavior) M:System.Data.SqlClient.SqlDataReader.System#Data#IDataRecord#GetData(System.Int32) T:System.Data.SqlClient.SQLDebugging T:System.Data.SqlClient.SqlDependency T:System.Data.SqlClient.SqlNotificationEventArgs T:System.Data.SqlClient.SqlNotificationInfo T:System.Data.SqlClient.SqlNotificationSource T:System.Data.SqlClient.SqlNotificationType M: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) M: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) P:System.Data.SqlClient.SqlParameter.ForceColumnEncryption P:System.Data.SqlClient.SqlParameter.UdtTypeName M:System.Data.SqlClient.SqlParameterCollection.Add(System.String,System.Object) M:System.Data.SqlClient.SqlParameterCollection.Add(System.String,System.Data.SqlDbType,System.Int32,System.String) ``` #### By Design missing * `T:System.Data.SqlClient.SqlProviderServices` - It is part of the EF provider model for old versions of EF that were part of .NET Framework. - see https://github.com/dotnet/corefx/issues/17126#issuecomment-301640792 ### Missing overrides ``` P:System.Data.SqlClient.SqlClientFactory.CanCreateDataSourceEnumerator M:System.Data.SqlClient.SqlClientFactory.CreateCommandBuilder M:System.Data.SqlClient.SqlClientFactory.CreateDataSourceEnumerator M:System.Data.SqlClient.SqlClientFactory.CreatePermission(System.Security.Permissions.PermissionState) M:System.Data.SqlClient.SqlClientPermission.Add(System.String,System.String,System.Data.KeyRestrictionBehavior) M:System.Data.SqlClient.SqlClientPermission.Copy M:System.Data.SqlClient.SqlClientPermissionAttribute.CreatePermission M:System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider.DecryptColumnEncryptionKey(System.String,System.String,System.Byte[]) M:System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider.EncryptColumnEncryptionKey(System.String,System.String,System.Byte[]) M:System.Data.SqlClient.SqlColumnEncryptionCngProvider.DecryptColumnEncryptionKey(System.String,System.String,System.Byte[]) M:System.Data.SqlClient.SqlColumnEncryptionCngProvider.EncryptColumnEncryptionKey(System.String,System.String,System.Byte[]) M:System.Data.SqlClient.SqlColumnEncryptionCspProvider.DecryptColumnEncryptionKey(System.String,System.String,System.Byte[]) M:System.Data.SqlClient.SqlColumnEncryptionCspProvider.EncryptColumnEncryptionKey(System.String,System.String,System.Byte[]) P:System.Data.SqlClient.SqlCommandBuilder.CatalogLocation P:System.Data.SqlClient.SqlCommandBuilder.CatalogSeparator P:System.Data.SqlClient.SqlCommandBuilder.QuotePrefix P:System.Data.SqlClient.SqlCommandBuilder.QuoteSuffix P:System.Data.SqlClient.SqlCommandBuilder.SchemaSeparator M:System.Data.SqlClient.SqlCommandBuilder.QuoteIdentifier(System.String) M:System.Data.SqlClient.SqlCommandBuilder.UnquoteIdentifier(System.String) M:System.Data.SqlClient.SqlConnection.GetSchema M:System.Data.SqlClient.SqlConnection.GetSchema(System.String) M:System.Data.SqlClient.SqlConnection.GetSchema(System.String,System.String[]) P:System.Data.SqlClient.SqlConnectionStringBuilder.IsFixedSize P:System.Data.SqlClient.SqlDataAdapter.UpdateBatchSize M:System.Data.SqlClient.SqlDataReader.Close M:System.Data.SqlClient.SqlDataReader.GetSchemaTable ``` **These were removed based on further investigation:** ``` 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 ``` **These were already fixed:** * `M:System.Data.SqlClient.SqlClientFactory.CreateDataAdapter` - https://github.com/dotnet/corefx/commit/88f562c80d8d78218ccc7b4be8b23ceab712a5f6 ---------- Original obsolete list:
``` 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.SqlClient.SqlBulkCopy.WriteToServer(System.Data.DataRow[])' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServer(System.Data.DataTable)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServer(System.Data.DataTable, System.Data.DataRowState)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServer(System.Data.IDataReader)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataRow[])' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataRow[], System.Threading.CancellationToken)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataTable)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataTable, System.Data.DataRowState)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataTable, System.Data.DataRowState, System.Threading.CancellationToken)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.DataTable, System.Threading.CancellationToken)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.IDataReader)' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(System.Data.IDataReader, System.Threading.CancellationToken)' 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.Clone()' 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)' 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. ```

from https://github.com/dotnet/corefx/blob/master/src/shims/ApiCompatBaseline.netcoreapp.netfx461.txt

corivera commented 7 years ago

CC @saurabh500 @geleems

corivera commented 7 years ago

SqlBulkCopy WriteToServer* methods are being added in this PR: https://github.com/dotnet/corefx/pull/16884

danmoseley commented 7 years ago

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)

saurabh500 commented 7 years ago

@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

danmoseley commented 7 years ago

@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.

danmoseley commented 7 years ago

In fact, given this is now post 2.0, I'd say members and types are equally interesting.

ViktorHofer commented 7 years ago

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.
danmoseley commented 7 years ago

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

NickCraver commented 7 years ago

UdtTypeName is a blocker for Dapper to add UDTs back in, I just hit this trying to do a netstandard2.0 build.

karelz commented 7 years ago

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?

danmoseley commented 7 years ago

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

danmoseley commented 7 years ago

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.

NickCraver commented 7 years ago

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
NickCraver commented 7 years ago

Can also remove M:System.Data.SqlClient.SqlClientFactory.CreateDataAdapter - it landed a few days ago in https://github.com/dotnet/corefx/commit/88f562c80d8d78218ccc7b4be8b23ceab712a5f6

karelz commented 7 years ago

I updated all the lists and merged them into master list in top post with help from @ViktorHofer. Thanks @NickCraver for verification!

divega commented 7 years ago

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.

divega commented 7 years ago

@karelz @danmosemsft is there a similar list for System.Data.Common or are those APIs complete?

karelz commented 7 years ago

@divega's API moved into "By Design missing" section. @ViktorHofer @danmosemsft can help create similar list for other namespaces.

ViktorHofer commented 7 years ago

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.
divega commented 7 years ago

@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.

ViktorHofer commented 7 years ago

I updated the above list. This should now be the full diff between netcoreapp20 and netfx461. Please excuse the mixed formatting.

ViktorHofer commented 7 years ago

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.

saurabh500 commented 7 years ago

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

gulbanana commented 7 years ago

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?

ViktorHofer commented 7 years ago

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.

karelz commented 7 years ago

@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.

gulbanana commented 7 years ago

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?

joelbraun commented 7 years ago

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?

danmoseley commented 7 years ago

@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.

karelz commented 7 years ago

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!

danmoseley commented 7 years ago

@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?

PeterStaev commented 6 years ago

+1 to add System.Data.SqlTypes.SqlFileStream.

Has anyone found a workaround for reading file streams from the database?

danmoseley commented 6 years ago

Here's an updated list - some of them have been ported since. I just looked for "Sql":

missing types (System.Data.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

missing members

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.

joelbraun commented 6 years ago

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).

danmoseley commented 6 years ago

@joelbraun that sounds great. @saurabh500 which part should he tackle? (I wouldn't wait for this though)

joelbraun commented 6 years ago

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.

danmoseley commented 6 years ago

@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?

saurabh500 commented 6 years ago

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)
joelbraun commented 6 years ago

@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.

saurabh500 commented 6 years ago

@joelbraun Thanks for the PR. Do you want to take on more APIs ?

joelbraun commented 6 years ago

@saurabh500 Sure, what would you like me to take a look at next?

saurabh500 commented 6 years ago

@joelbraun Would you be interested in taking up SqlCredential?

saurabh500 commented 6 years ago
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.

joelbraun commented 6 years ago

@saurabh500 Sounds like a plan to me, I'll take a look at those and get started.

saurabh500 commented 6 years ago

@joelbraun The issue for the type SqlCredential is at https://github.com/dotnet/corefx/issues/11542

olmobrutall commented 6 years ago

I’m not able to use SqlHierarchyId because IBinarySerialize is missing.

Anybody has a solution? or it just doesn’t work yet?

chucker commented 6 years ago

I just ran into this with SqlFacetAttribute (on an SqlFunction). Is implementing that planned / are you looking for pull requests?

BalassaMarton commented 6 years ago

System.Data.SqlClient.SqlBulkCopy.Dispose is also missing. Painful.

MgSam commented 6 years ago

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?

danmoseley commented 6 years ago

@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