SqlClient implementation and API is not complete in Core

Created on 14 Mar 2017  Â·  68Comments  Â·  Source: dotnet/SqlClient

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

  • it defies user expectations that if a type X exists, code from other platforms that use X will work on .NET Core
  • it cannot be fixed without servicing -- it is not possible to supply a standalone package with the rest of the type definition

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.


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

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:


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

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

Enhancement

Most helpful comment

+1 to SqlDataSourceEnumerator 😉

All 68 comments

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":

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.

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

@joelbraun we never asked whether you would like to port more - any interest?

@danmosemsft Sure, I've got some free time again. What features do you want me to look into porting over next?

@joelbraun May I suggest System.Data.Sql.SqlDataSourceEnumerator?

@danmosemsft @saurabh500 Can you update\show little roadmap for this issue? I wanna continue contribute while my previous PR on review

@David-Engel @keeratsingh @AfsanehR should be able to comment on plans here

@karelz Anyone saw them?

There is internal discussion with Sql team. It is holiday season now, so expect delayed answers :( ...

As recently announced in the .NET Blog, focus on new SqlClient features an improvements is moving to the new Microsoft.Data.SqlClient package. For this reason, we are moving this issue to the new repo at https://github.com/dotnet/SqlClient. We will still use https://github.com/dotnet/corefx to track issues on other providers like System.Data.Odbc and System.Data.OleDB, and general ADO.NET and .NET data access issues.

To reflect the current state of the API, here is a list of classes, enums and members that exists in .NET Framework on System.Data.SqlClient and that are missing in .NET Core's version of Microsoft.Data.SqlClient:

Kind | Type | Member | Feature
-- | -- | -- | --
Class | SqlDataSourceEnumerator ||
Class | SqlAuthenticationInitializer || AAD
Class | SqlAuthenticationParameters || AAD
Class | SqlAuthenticationProvider || AAD
Class | SqlAuthenticationToken || AAD
Class | SqlClientLogger || AAD
Class | SQLDebugging ||  
Enum | SqlAuthenticationMethod || AAD
Property | SqlBulkCopyOptions | AllowEncryptedValueModifications | AE
Property | SqlCommand | NotificationAutoEnlist |
Property | SqlConnectionStringBuilder | AsynchronousProcessing |
Property | SqlConnectionStringBuilder | Authentication | AAD
Property | SqlConnectionStringBuilder | NetworkLibrary |
Property | SqlConnectionStringBuilder | TransparentNetworkIPResolution |
Property | SqlParameterCollection | IsSynchonized

I have omitted from the diff APIs that are obsolete in .NET Framework and those that depend on System.Configuration, XML serialization, etc.

@divega Assume this reflects the current status of the .NET Core 3.0 bits?

@ErikEJ, it should reflect the latest public preview of Microsoft.Data.SqlClient.

I downloaded the latest preview 1.1.0-preview1.19275.1 and did not see SqlDataSourceEnumerator.
Is this supposed to be included?

@dgxhubbard SqlDataSourceEnumerator is not in .NET Core yet. Below is the updated table of classes and properties that exists in .NET Framework but lacking in .NET Core:

Kind | Type | Member | Feature
-- | -- | -- | --
Class | SqlDataSourceEnumerator ||
Class | SqlClientLogger || AAD
Class | SQLDebugging ||  
Property | SqlCommand | NotificationAutoEnlist |
Property | SqlConnectionStringBuilder | TransparentNetworkIPResolution |

+1 to SqlDataSourceEnumerator 😉

I have come back to my project and this issue - Is there any ETA on SqlDataSourceEnumerator? What would be the difficulty in implementing it?

Thanks 😃

Hi @LukeTOBrien

We did a quick investigation before but the original implementation of SqlDataSourceEnumerator is tied to native C++ APIs which are not exposed in our current SNI DLLs. Since our goal is to move away from Native Code for .NET Core full managed support, we have to come up with Managed Code counterparts to support it cross-platform. It's in our backlog queue and will be picked up as and when prioritized.

Okey dokey thanks for letting me know

On Fri, Jul 10, 2020 at 8:53 PM Cheena Malhotra notifications@github.com
wrote:

Hi @LukeTOBrien https://github.com/LukeTOBrien

We did a quick investigation before but the original implementation is
tied to native C++ APIs which are not exposed in our current SNI DLLs.
Since our goal is to move away from Native Code, we have to come up with
Managed Code counterparts. It's in our backlog queue and will be picked up
as and when prioritized.

—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/dotnet/SqlClient/issues/17#issuecomment-656861690,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AD3KMFNHSM6USDFYA6OTJGTR25WTNANCNFSM4HNHTONQ
.

For anyone looking for a "in the mean time" solution to SqlDataSourceEnumerator, I've created a repository here : Sql Browser Client with a UDP broadcast solution.

Was this page helpful?
0 / 5 - 0 ratings