diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs index ef74c5a338..159f821082 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs @@ -405,7 +405,7 @@ private enum _SqlMetadataFlags : int IsIdentity = 1 << 6, IsColumnSet = 1 << 7, - IsReadOnlyMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown) + IsUpdatableMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown) } internal string column; @@ -453,13 +453,13 @@ internal string tableName public byte Updatability { - get => (byte)(flags & _SqlMetadataFlags.IsReadOnlyMask); + get => (byte)(flags & _SqlMetadataFlags.IsUpdatableMask); set => flags = (_SqlMetadataFlags)((value & 0x3) | ((int)flags & ~0x03)); } public bool IsReadOnly { - get => flags.HasFlag(_SqlMetadataFlags.IsReadOnlyMask); + get => (flags & _SqlMetadataFlags.IsUpdatableMask) == 0; } public bool IsDifferentName diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs index a9bc18454f..96eb11c0d2 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs @@ -585,7 +585,7 @@ private enum _SqlMetadataFlags : int IsIdentity = 1 << 6, IsColumnSet = 1 << 7, - IsReadOnlyMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown) + IsUpdatableMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown) } internal string column; @@ -633,13 +633,13 @@ internal string tableName public byte Updatability { - get => (byte)(flags & _SqlMetadataFlags.IsReadOnlyMask); + get => (byte)(flags & _SqlMetadataFlags.IsUpdatableMask); set => flags = (_SqlMetadataFlags)((value & 0x3) | ((int)flags & ~0x03)); } public bool IsReadOnly { - get => flags.HasFlag(_SqlMetadataFlags.IsReadOnlyMask); + get => (flags & _SqlMetadataFlags.IsUpdatableMask) == 0; } public bool IsDifferentName diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs index 8976f92c04..99f1b2dd67 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; @@ -1255,6 +1256,52 @@ public void TestDeriveParameters() } } + [CheckConnStrSetupFact] + public void TestReadOnlyColumnMetadata() + { + using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) + { + connection.Open(); + using (SqlCommand command = connection.CreateCommand()) + { + command.CommandText = "Create table #t (ID int identity(1,1), sText varchar(12), sMemo as (convert(varchar,ID) + ' ' + sText))"; + command.ExecuteNonQuery(); + } + using (SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from #t", connection)) + { + using (SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter)) + { + using (SqlCommand cmd = commandBuilder.GetInsertCommand()) + { + DataTestUtility.AssertEqualsWithDescription("INSERT INTO [#t] ([sText]) VALUES (@p1)", cmd.CommandText, "Unexpected insert command."); + } + } + + using (DataTable dataTable = new DataTable()) + { + dataAdapter.FillSchema(dataTable, SchemaType.Mapped); + Dictionary expAutoIncrement = new Dictionary() + { + {"ID", true}, + {"sText", false}, + {"sMemo", false} + }; + Dictionary expReadOnly = new Dictionary() + { + {"ID", true}, + {"sText", false}, + {"sMemo", true} + }; + foreach (DataColumn dataColumn in dataTable.Columns) + { + DataTestUtility.AssertEqualsWithDescription(dataColumn.AutoIncrement, expAutoIncrement[dataColumn.ColumnName], "Unexpected AutoIncrement metadata."); + DataTestUtility.AssertEqualsWithDescription(dataColumn.ReadOnly, expReadOnly[dataColumn.ColumnName], "Unexpected ReadOnly metadata."); + } + } + } + } + } + #region Utility_Methods private void CheckParameters(SqlCommand cmd, string expectedResults) {