Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SqlClient implementation and API is not complete in Core #17

Open
danmoseley opened this issue Mar 14, 2017 · 69 comments
Open

SqlClient implementation and API is not complete in Core #17

danmoseley opened this issue Mar 14, 2017 · 69 comments
Labels
💡 Enhancement Issues that are feature requests for the drivers we maintain.

Comments

@danmoseley
Copy link
Member

danmoseley commented Mar 14, 2017

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.


[benrr101] Updating in 2024, note that SqlClient is now Microsoft.Data.SqlClient

Missing APIs List (as of 04/03/2024)

  • T:System.Data.SqlClient.OnChangeEventHandler - Added circa 04/2020
  • T:System.Data.SqlClient.PoolBlockingPeriod - Added circa 06/2020
  • T:System.Data.SqlClient.SqlAuthenticationMethod - Added circa 08/2019
  • M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.Clear - Added circa 10/2021
  • M:System.Data.SqlClient.SqlBulkCopyColumnMappingCollection.RemoveAt(Int32) - Added circa 10/2021
  • F:System.Data.SqlClient.SqlBulkCopyOptions.AllowEncryptedValueModifications - Added circa 04/2020
  • ▶️ M:System.Data.SqlClient.SqlClientFactory.GetService(Type)
  • M:System.Data.SqlClient.SqlClientFactory.CreateCommandBuilder - Added 08/2019
  • M:System.Data.SqlClient.SqlClientFactory.CreateDataSourceEnumerator
    • Implemented via System.Data.Common.DbProviderFactory which returns null.
  • M:System.Data.SqlClient.SqlClientFactory.CreatePermission(PermissionState)
    • Still in netfx package, but not in netfx documentation
  • P:System.Data.SqlClient.SqlClientFactory.CanCreateDataSourceEnumerator
    • Implemented via System.Data.Common.DbProviderFactory which returns false.
  • M:System.Data.SqlClient.SqlClientPermission.Add(String,String,KeyRestrictionBehavior)
    • Still in netfx package, but not in netfx documentation
  • M:System.Data.SqlClient.SqlClientPermission.Copy
    • Still in netfx package, but not in netfx documentation
  • M:System.Data.SqlClient.SqlClientPermissionAttribute.CreatePermission
    • Still in netfx package, but not in netfx documentation
  • T:System.Data.SqlClient.SqlClientMetaDataCollectionNames - Added circa 09/2021
  • T:System.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider - Added circa 08/2019
  • T:System.Data.SqlClient.SqlColumnEncryptionCngProvider - Added circa 08/2019
  • T:System.Data.SqlClient.SqlColumnEncryptionCspProvider - Added circa 08/2019
  • T:System.Data.SqlClient.SqlColumnEncryptionKeyStoreProvider - Added circa 04/2020
  • P:System.Data.SqlClient.SqlCommand.ColumnEncryptionSetting - Added circa 08/2019
  • P:System.Data.SqlClient.SqlCommand.Notification - Added circa 08/2019
  • ▶️ P:System.Data.SqlClient.SqlCommand.NotificationAutoEnlist
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery - Added circa 01/2021
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteNonQuery(AsyncCallback,Object) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteReader - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(AsyncCallback,Object) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(AsyncCallback,Object,CommandBehavior) - Added circa 03/2020
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteReader(CommandBehavior) - Added circa 01/2021
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.BeginExecuteXmlReader(AsyncCallback,Object) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult) - Added circa 03/2020
  • M:System.Data.SqlClient.SqlCommand.EndExecuteReader(IAsyncResult) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.EndExecuteXmlReader(IAsyncResult) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlCommand.ResetCommandTimeout - Added circa 08/2019
  • T:System.Data.SqlClient.SqlCommandBuilder - Added circa 10/2021
  • T:System.Data.SqlClient.SqlCommandColumnEncryptionSetting - Added circa 04/2022
  • M:System.Data.SqlClient.SqlConnection.#ctor(String,SqlCredential) - Added circa 08/2019
  • P:System.Data.SqlClient.SqlSonnection.AccessToken - Added circa 08/2019
  • P:System.Data.SqlClient.SqlConnection.ColumnEncryptionKeyCacheTtl - Added circa 08/2019
  • P:System.Data.SqlClient.SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled - Added circa 08/2019
  • P:System.Data.SqlClient.SqlConnection.ColumnEncryptionTrustedMasterKeyPaths - Added circa 08/2019
  • P:System.Data.SqlClient.SqlConnection.Credential - Added circa 08/2019
  • M:System.Data.SqlClient.SqlConnection.ChangePassword(String,SqlCredential,SecureString) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlConnection.ChangePassword(String,String) - Added circa 08/2019
  • ▶️ M:System.Data.SqlClient.SqlConnection.EnlistDistributedTransaction(System.EnterpriseServices.ITransaction)
    • EnterpriseServices isn't supported in netcore, would this ever be supported?
  • M:System.Data.SqlClient.SqlConnection.GetSchema - Added circa 08/2019
  • M:System.Data.SqlClient.SqlConnection.GetSchema(String) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlConnection.GetSchema(String,String[]) - Added circa 08/2019
  • M:System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(IDictionary{String,SqlColumnEncryptionKeyStoreProvider}) - Added circa 08/2019
  • T:System.Data.SqlClient.SqlConnectionColumnEncryptionSetting - Added circa 04/2022
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.AsynchronousProcessing - Removed from netfx
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.Authentication - Added circa 10/2021
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.ColumnEncryptionSetting - Added circa 10/2021
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.ConnectionReset - Obsolete in netfx
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.ContextConnection - Obsolete in netfx
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.Enlist - Added circa 10/2021
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.IsFixedSize - Added circa 10/2021
  • ▶️ P:System.Data.SqlClient.SqlConnectionStringBuilder.NetworkLibrary
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod - Added circa 10/2021
  • P:System.Data.SqlClient.SqlConnectionStringBuilder.TransactionBinding - Added circa 10/2021
  • ▶️ P:System.Data.SqlClient.SqlConnectionStringBuilder.TransparentNetworkIPResolution
  • T:System.Data.SqlClient.SqlCredential - Added circa 08/2019
  • P:System.Data.SqlClient.SqlDataAdapter.UpdateBatchSize - Added circa 10/2021
  • M:System.Data.SqlClient.SqlDataReader.Close - Added circa 08/2019
  • M:System.Data.SqlClient.SqlDataReader.GetData(Int32)
    • Implemented via System.Data.Common base implementation, which always throws NotSupported. Netfx implementation also always throws NotSupported.
  • M:System.Data.SqlClient.SqlDataReader.GetSchemaTable - Added circa 08/2019
  • M:System.Data.SqlClient.SqlDataReader.IsCommandBehavior(CommandBehavior) - Added circa 08/2019
  • ▶️ T:System.Data.SqlClient.SQLDebugging
  • T:System.Data.SqlClient.SqlDependency - Added circa 10/2021
  • T:System.Data.SqlClient.SqlNotificationEventArgs - Added circa 10/2021
  • T:System.Data.SqlClient.SqlNotificationInfo - Added circa 04/2020
  • T:System.Data.SqlClient.SqlNotificationType - Added circa 04/2020
  • M:System.Data.SqlClient.SqlParameter.#ctor(String,SqlDbType,Int32,ParameterDirection,Boolean,Byte,Bute,String,DataRowVersion,Object) - Added circa 03/2021
  • M:System.Data.SqlClient.SqlParameter.#ctor(String,SqlDbType,Int32,ParameterDirection,Byte,Byte,String,DataRowVersion,Boolean,Object,String,String,String) - Added circa 06/2022
  • M:System.Data.SqlClient.SqlParameter.ForceColumnEncryption - Added circa 06/2022
  • M:System.Data.SqlClient.SqlParameter.UdtTypeName - Added circa 03/2021
  • M:System.Data.SqlClient.SqlParameterCollection.Add(String,Object) - Removed from netfx
  • M:System.Data.SqlClient.SqlParameterCollection.Add(String,SqlDbType,Int32,String) - Added circa 03/2021

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

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)' 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
Copy link
Member

CC @saurabh500 @geleems

@corivera corivera self-assigned this Mar 14, 2017
@corivera
Copy link
Member

corivera commented Mar 14, 2017

SqlBulkCopy WriteToServer* methods are being added in this PR:
dotnet/corefx#16884

@danmoseley
Copy link
Member Author

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
Copy link
Contributor

@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
Copy link
Member Author

@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
Copy link
Member Author

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

@ViktorHofer
Copy link
Member

ViktorHofer commented Apr 6, 2017

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.

@corivera corivera removed their assignment Apr 24, 2017
@danmoseley
Copy link
Member Author

danmoseley commented May 10, 2017

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
Copy link
Member

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

NickCraver referenced this issue in DapperLib/Dapper May 12, 2017
This adds a netstandard2.0 build to Dapper (and StrongName until v2),
adds a netstandard2.0 test lineup, restores most functionality (except
UDTs for SQL, e.g. .UdtTypeName isn't in netstandard2), and also breaks
things not actually implemented or implemented correctly in
netstandard2.0. Pushing this up so we can work through these with the
.NET teams.

Several things are still broken here (and fail tests):
- Parameter decimal values (not filed yet)
- DataTables as parameters
(https://github.com/dotnet/corefx/issues/19708)
- .GetSchemaTable() (not yet filed, implementation is completely missing
from SqlDataReader in CoreFX)

While the compile is clean, the above are runtime issues.
`SqlParameter.UdtTypeName` is a separate issue, that one just wasn't in
`netstandard2.0` at all...so we can't support UDTs there until it is.
See https://github.com/dotnet/corefx/issues/17126 for details.
@karelz
Copy link
Member

karelz commented May 13, 2017

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
Copy link
Member Author

danmoseley commented May 15, 2017

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
Copy link
Member Author

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.

@danmoseley danmoseley changed the title SqlClient types do not fulfil desktop surface area SqlClient implementation and API is not complete in Core May 15, 2017
@NickCraver
Copy link
Member

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
Copy link
Member

Can also remove M:System.Data.SqlClient.SqlClientFactory.CreateDataAdapter - it landed a few days ago in dotnet/corefx@88f562c

@karelz
Copy link
Member

karelz commented May 15, 2017

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

@divega
Copy link

divega commented May 16, 2017

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
Copy link

divega commented May 16, 2017

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

@karelz
Copy link
Member

karelz commented May 16, 2017

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

@ViktorHofer
Copy link
Member

ViktorHofer commented May 16, 2017

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
Copy link

divega commented May 16, 2017

@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
Copy link
Member

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

@ViktorHofer
Copy link
Member

ViktorHofer commented May 16, 2017

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
Copy link
Contributor

saurabh500 commented May 17, 2017

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
Copy link

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
Copy link
Member

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
Copy link
Member

karelz commented May 26, 2017

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

@MgSam
Copy link

MgSam commented Nov 9, 2018

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
Copy link
Member Author

@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

@danmoseley
Copy link
Member Author

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

@joelbraun
Copy link

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

@haletothewood
Copy link

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

@galakt
Copy link

galakt commented Dec 10, 2018

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

@karelz
Copy link
Member

karelz commented Dec 10, 2018

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

@galakt
Copy link

galakt commented Dec 18, 2018

@karelz Anyone saw them?

@karelz
Copy link
Member

karelz commented Dec 18, 2018

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

@divega
Copy link

divega commented May 15, 2019

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.

@divega divega transferred this issue from dotnet/corefx May 15, 2019
@David-Engel David-Engel added the 💡 Enhancement Issues that are feature requests for the drivers we maintain. label May 20, 2019
@divega
Copy link

divega commented Jun 4, 2019

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.

@ErikEJ
Copy link
Contributor

ErikEJ commented Jun 5, 2019

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

@divega
Copy link

divega commented Jun 5, 2019

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

@dgxhubbard
Copy link

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

@yukiwongky
Copy link
Contributor

yukiwongky commented Oct 23, 2019

@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

@LukeTOBrien
Copy link

LukeTOBrien commented Apr 23, 2020

+1 to SqlDataSourceEnumerator 😉

@LukeTOBrien
Copy link

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 😃

@cheenamalhotra
Copy link
Member

cheenamalhotra commented Jul 10, 2020

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.

@LukeTOBrien
Copy link

LukeTOBrien commented Jul 10, 2020 via email

@mrsquish
Copy link

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.

@menees
Copy link

menees commented Jun 21, 2023

FWIW, SqlDataSourceEnumerator is implemented in Microsoft.Data.SqlClient v5.0 and later. It's in the Microsoft.Data.Sql namespace now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💡 Enhancement Issues that are feature requests for the drivers we maintain.
Projects
None yet
Development

No branches or pull requests