Skip to content

Commit 4827a00

Browse files
committed
fix: correctly encode DateTime parameters for MSSQL RPC calls
1 parent 6625239 commit 4827a00

3 files changed

Lines changed: 34 additions & 2 deletions

File tree

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
<Authors>vkuttyp</Authors>
88
<PackageLicenseExpression>MIT</PackageLicenseExpression>
99
<RepositoryUrl>https://github.com/vkuttyp/CosmoSQLClient-Dotnet</RepositoryUrl>
10-
<Version>1.9.1</Version>
10+
<Version>1.9.3</Version>
1111
</PropertyGroup>
1212
</Project>

src/CosmoSQLClient.MsSql/MsSqlConnection.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ private static string BuildParamDeclarations(IReadOnlyList<SqlParameter> paramet
500500
private static string SqlValueToTypeName(SqlValue v) => v switch {
501501
SqlValue.Bool => "BIT", SqlValue.Int32 => "INT", SqlValue.Int64 => "BIGINT",
502502
SqlValue.Float => "REAL", SqlValue.Double => "FLOAT", SqlValue.Decimal => "DECIMAL(38,10)",
503-
SqlValue.Date => "DATETIME2", SqlValue.Uuid => "UNIQUEIDENTIFIER", _ => "NVARCHAR(MAX)"
503+
SqlValue.Date => "DATETIME", SqlValue.Uuid => "UNIQUEIDENTIFIER", _ => "NVARCHAR(MAX)"
504504
};
505505

506506
private static void WriteAllHeaders(BinaryWriter bw, long tx) {
@@ -548,6 +548,22 @@ private static void WriteNamedParam(BinaryWriter bw, string name, SqlValue value
548548
case SqlValue.Text v:
549549
WriteNvarcharMaxTypeAndValue(bw, v.Value);
550550
break;
551+
case SqlValue.Date v:
552+
bw.Write((byte)0x6F); // DATETIMN
553+
bw.Write((byte)0x08); // Max length for DATETIME
554+
bw.Write((byte)0x08); // Actual data length
555+
// Encode as DATETIME (8 bytes)
556+
var dt = v.Value;
557+
var days = (int)(dt.Date - new DateTime(1900, 1, 1)).TotalDays;
558+
var ticks = (int)(dt.TimeOfDay.TotalSeconds * 300);
559+
bw.Write(days);
560+
bw.Write(ticks);
561+
break;
562+
case SqlValue.Uuid v:
563+
bw.Write((byte)0x24); // UNIQUEIDENTIFIER
564+
bw.Write((byte)0x10); // length
565+
bw.Write(v.Value.ToByteArray());
566+
break;
551567
default:
552568
WriteNvarcharMaxTypeAndValue(bw, value.AsString());
553569
break;

tests/CosmoSQLClient.MsSql.Tests/AdoNetTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,22 @@ public async Task StandardAdoNet_AddWithValue_Abstraction_ShouldWork()
131131
Assert.Equal("Hello Extension", result);
132132
}
133133

134+
[Fact]
135+
public async Task StandardAdoNet_DateTimeParameter_ShouldWork()
136+
{
137+
if (ShouldSkip) return;
138+
139+
using var conn = new MsSqlConnection(ConnectionString);
140+
await conn.OpenAsync();
141+
142+
using var cmd = new MsSqlCommand("SELECT @val AS Echo", conn);
143+
var now = new DateTime(2023, 10, 27, 12, 34, 56);
144+
cmd.Parameters.AddWithValue("@val", now);
145+
146+
var result = await cmd.ExecuteScalarAsync();
147+
Assert.Equal(now, (DateTime)result!);
148+
}
149+
134150
[Fact]
135151
public async Task StandardAdoNet_Transactions_ShouldWork()
136152
{

0 commit comments

Comments
 (0)