Skip to content

Commit 486908b

Browse files
yukiwongkyDavid-Engel
authored andcommitted
Fix getting readonly column metadata (#286)
1 parent da1fe26 commit 486908b

File tree

3 files changed

+53
-6
lines changed

3 files changed

+53
-6
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ private enum _SqlMetadataFlags : int
405405
IsIdentity = 1 << 6,
406406
IsColumnSet = 1 << 7,
407407

408-
IsReadOnlyMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
408+
IsUpdatableMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
409409
}
410410

411411
internal string column;
@@ -453,13 +453,13 @@ internal string tableName
453453

454454
public byte Updatability
455455
{
456-
get => (byte)(flags & _SqlMetadataFlags.IsReadOnlyMask);
456+
get => (byte)(flags & _SqlMetadataFlags.IsUpdatableMask);
457457
set => flags = (_SqlMetadataFlags)((value & 0x3) | ((int)flags & ~0x03));
458458
}
459459

460460
public bool IsReadOnly
461461
{
462-
get => flags.HasFlag(_SqlMetadataFlags.IsReadOnlyMask);
462+
get => (flags & _SqlMetadataFlags.IsUpdatableMask) == 0;
463463
}
464464

465465
public bool IsDifferentName

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParserHelperClasses.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ private enum _SqlMetadataFlags : int
585585
IsIdentity = 1 << 6,
586586
IsColumnSet = 1 << 7,
587587

588-
IsReadOnlyMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
588+
IsUpdatableMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
589589
}
590590

591591
internal string column;
@@ -633,13 +633,13 @@ internal string tableName
633633

634634
public byte Updatability
635635
{
636-
get => (byte)(flags & _SqlMetadataFlags.IsReadOnlyMask);
636+
get => (byte)(flags & _SqlMetadataFlags.IsUpdatableMask);
637637
set => flags = (_SqlMetadataFlags)((value & 0x3) | ((int)flags & ~0x03));
638638
}
639639

640640
public bool IsReadOnly
641641
{
642-
get => flags.HasFlag(_SqlMetadataFlags.IsReadOnlyMask);
642+
get => (flags & _SqlMetadataFlags.IsUpdatableMask) == 0;
643643
}
644644

645645
public bool IsDifferentName

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections;
7+
using System.Collections.Generic;
78
using System.Data;
89
using System.Data.SqlTypes;
910
using System.Diagnostics;
@@ -1255,6 +1256,52 @@ public void TestDeriveParameters()
12551256
}
12561257
}
12571258

1259+
[CheckConnStrSetupFact]
1260+
public void TestReadOnlyColumnMetadata()
1261+
{
1262+
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
1263+
{
1264+
connection.Open();
1265+
using (SqlCommand command = connection.CreateCommand())
1266+
{
1267+
command.CommandText = "Create table #t (ID int identity(1,1), sText varchar(12), sMemo as (convert(varchar,ID) + ' ' + sText))";
1268+
command.ExecuteNonQuery();
1269+
}
1270+
using (SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from #t", connection))
1271+
{
1272+
using (SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter))
1273+
{
1274+
using (SqlCommand cmd = commandBuilder.GetInsertCommand())
1275+
{
1276+
DataTestUtility.AssertEqualsWithDescription("INSERT INTO [#t] ([sText]) VALUES (@p1)", cmd.CommandText, "Unexpected insert command.");
1277+
}
1278+
}
1279+
1280+
using (DataTable dataTable = new DataTable())
1281+
{
1282+
dataAdapter.FillSchema(dataTable, SchemaType.Mapped);
1283+
Dictionary<string, bool> expAutoIncrement = new Dictionary<string, bool>()
1284+
{
1285+
{"ID", true},
1286+
{"sText", false},
1287+
{"sMemo", false}
1288+
};
1289+
Dictionary<string, bool> expReadOnly = new Dictionary<string, bool>()
1290+
{
1291+
{"ID", true},
1292+
{"sText", false},
1293+
{"sMemo", true}
1294+
};
1295+
foreach (DataColumn dataColumn in dataTable.Columns)
1296+
{
1297+
DataTestUtility.AssertEqualsWithDescription(dataColumn.AutoIncrement, expAutoIncrement[dataColumn.ColumnName], "Unexpected AutoIncrement metadata.");
1298+
DataTestUtility.AssertEqualsWithDescription(dataColumn.ReadOnly, expReadOnly[dataColumn.ColumnName], "Unexpected ReadOnly metadata.");
1299+
}
1300+
}
1301+
}
1302+
}
1303+
}
1304+
12581305
#region Utility_Methods
12591306
private void CheckParameters(SqlCommand cmd, string expectedResults)
12601307
{

0 commit comments

Comments
 (0)