From d162452c75d4e63063f3441f9e746d752ed1173d Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Fri, 25 Oct 2019 12:08:24 -0700 Subject: [PATCH] Fix getting readonly column metadata --- .../Data/SqlClient/TdsParserHelperClasses.cs | 6 +-- .../SQL/AdapterTest/AdapterTest.cs | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserHelperClasses.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserHelperClasses.cs index 056d6bbcb03b..f8e3f6ecd8c3 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserHelperClasses.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserHelperClasses.cs @@ -341,7 +341,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; @@ -391,13 +391,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/System.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs b/src/System.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs index a91f0f944746..d76838a832b4 100644 --- a/src/System.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs +++ b/src/System.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs @@ -7,6 +7,7 @@ using System.Text; using System.Reflection; using System.Collections; +using System.Collections.Generic; using System.Diagnostics; using Xunit; @@ -1243,6 +1244,52 @@ public void TestDeriveParameters() } } + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + public void TestReadOnlyColumnMetadata() + { + using (SqlConnection connection = new SqlConnection(DataTestUtility.TcpConnStr)) + { + 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) {