Skip to content

Commit b5ce725

Browse files
ErikEJbenrr101
andauthored
[TEST] Improve SqlDataRecord DateOnly and TimeOnly coverage (#3128)
* Improve SqlDataRecord DateOnly and TimeOnly coverage Make SqlDecimalConvertToDecimal_TestInRange run on non-US systems fixes #3125 related to #2258 * make tests actually pass :-( * netfx test fix --------- Co-authored-by: Ben Russell <russellben@microsoft.com>
1 parent cefeabc commit b5ce725

File tree

2 files changed

+92
-8
lines changed

2 files changed

+92
-8
lines changed

src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ public void SqlRecordFillTest()
3434
new SqlMetaData("col11", SqlDbType.Real),
3535
new SqlMetaData("col12", SqlDbType.Decimal),
3636
new SqlMetaData("col13", SqlDbType.Money),
37-
new SqlMetaData("col14", SqlDbType.Variant)
37+
new SqlMetaData("col14", SqlDbType.Variant),
38+
#if NET
39+
new SqlMetaData("col15", SqlDbType.Date),
40+
new SqlMetaData("col16", SqlDbType.Time),
41+
#endif
3842
};
3943

4044
SqlDataRecord record = new SqlDataRecord(metaData);
@@ -116,13 +120,22 @@ public void SqlRecordFillTest()
116120
record.SetSqlMoney(12, SqlMoney.MaxValue);
117121
Assert.Equal(SqlMoney.MaxValue, record.GetSqlMoney(12));
118122

123+
int offset = 1;
124+
#if NET
125+
offset = 3;
126+
record.SetValue(14, new DateOnly(2025, 11,28));
127+
Assert.Equal(new DateTime(2025, 11, 28), record.GetValue(14));
128+
129+
record.SetValue(15, new TimeOnly(1, 57, 58));
130+
Assert.Equal(new TimeSpan(1, 57, 58), record.GetValue(15));
131+
#endif
119132

120133
// Try adding different values to SqlVariant type
121-
for (int i = 0; i < record.FieldCount - 1; ++i)
134+
for (int i = 0; i < record.FieldCount - offset; ++i)
122135
{
123136
object valueToSet = record.GetSqlValue(i);
124-
record.SetValue(record.FieldCount - 1, valueToSet);
125-
object o = record.GetSqlValue(record.FieldCount - 1);
137+
record.SetValue(record.FieldCount - offset, valueToSet);
138+
object o = record.GetSqlValue(record.FieldCount - offset);
126139

127140
if (o is SqlBinary)
128141
{
@@ -133,8 +146,8 @@ public void SqlRecordFillTest()
133146
Assert.Equal(valueToSet, o);
134147
}
135148

136-
record.SetDBNull(record.FieldCount - 1);
137-
Assert.Equal(DBNull.Value, record.GetSqlValue(record.FieldCount - 1));
149+
record.SetDBNull(record.FieldCount - offset);
150+
Assert.Equal(DBNull.Value, record.GetSqlValue(record.FieldCount - offset));
138151

139152
record.SetDBNull(i);
140153
Assert.Equal(DBNull.Value, record.GetValue(i));

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using System.Data.SqlTypes;
1010
using System.Threading;
1111
using Xunit;
12+
using System.Globalization;
13+
1214
#if !NETFRAMEWORK
1315
using Microsoft.SqlServer.Types;
1416
using Microsoft.Data.SqlClient.Server;
@@ -442,6 +444,75 @@ public static void TestDateOnlyTVPDataTable_CommandSP()
442444
DataTestUtility.DropUserDefinedType(connection, tableTypeName);
443445
}
444446
}
447+
448+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
449+
public static void TestDateOnlyTVPSqlDataRecord_CommandSP()
450+
{
451+
string tableTypeName = "[dbo]." + DataTestUtility.GetUniqueNameForSqlServer("UDTTTestDateOnlySqlDataRecordTVP");
452+
string spName = DataTestUtility.GetUniqueNameForSqlServer("spTestDateOnlySqlDataRecordTVP");
453+
SqlConnection connection = new(s_connString);
454+
try
455+
{
456+
connection.Open();
457+
using (SqlCommand cmd = connection.CreateCommand())
458+
{
459+
cmd.CommandType = CommandType.Text;
460+
cmd.CommandText = $"CREATE TYPE {tableTypeName} AS TABLE ([DateColumn] date NULL, [TimeColumn] time NULL)";
461+
cmd.ExecuteNonQuery();
462+
cmd.CommandText = $"CREATE PROCEDURE {spName} (@dates {tableTypeName} READONLY) AS SELECT COUNT(*) FROM @dates";
463+
cmd.ExecuteNonQuery();
464+
}
465+
using (SqlCommand cmd = connection.CreateCommand())
466+
{
467+
cmd.CommandText = spName;
468+
cmd.CommandType = CommandType.StoredProcedure;
469+
470+
SqlMetaData[] metadata = new SqlMetaData[]
471+
{
472+
new SqlMetaData("DateColumn", SqlDbType.Date),
473+
new SqlMetaData("TimeColumn", SqlDbType.Time)
474+
};
475+
476+
SqlDataRecord record1 = new SqlDataRecord(metadata);
477+
record1.SetValues(new DateOnly(2023, 11, 15), new TimeOnly(12, 30, 45));
478+
479+
SqlDataRecord record2 = new SqlDataRecord(metadata);
480+
record2.SetValues(new DateOnly(2025, 11, 15), new TimeOnly(13, 31, 46));
481+
482+
IList<SqlDataRecord> featureInserts = new List<SqlDataRecord>
483+
{
484+
record1,
485+
record2,
486+
};
487+
488+
cmd.Parameters.Add(new SqlParameter
489+
{
490+
ParameterName = "@dates",
491+
SqlDbType = SqlDbType.Structured,
492+
TypeName = tableTypeName,
493+
Value = featureInserts,
494+
});
495+
496+
using var reader = cmd.ExecuteReader();
497+
498+
Assert.True(reader.HasRows);
499+
500+
int count = 0;
501+
while (reader.Read())
502+
{
503+
Assert.NotNull(reader[0]);
504+
count++;
505+
}
506+
507+
Assert.Equal(1, count);
508+
}
509+
}
510+
finally
511+
{
512+
DataTestUtility.DropStoredProcedure(connection, spName);
513+
DataTestUtility.DropUserDefinedType(connection, tableTypeName);
514+
}
515+
}
445516
#endif
446517

447518
#region Scaled Decimal Parameter & TVP Test
@@ -471,8 +542,8 @@ public static void SqlDecimalConvertToDecimal_TestInRange(string sqlDecimalValue
471542
cmd.Connection = cnn;
472543
using SqlDataReader rdr = cmd.ExecuteReader();
473544
Assert.True(rdr.Read(), "SqlDataReader must have a value");
474-
decimal retrunValue = rdr.GetDecimal(0);
475-
Assert.Equal(expectedDecimalValue, retrunValue.ToString());
545+
decimal returnValue = rdr.GetDecimal(0);
546+
Assert.Equal(expectedDecimalValue, returnValue.ToString(CultureInfo.InvariantCulture));
476547
}
477548

478549
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]

0 commit comments

Comments
 (0)