Skip to content

Commit 6625239

Browse files
committed
feat: add AddWithValue extension methods for DbParameterCollection to support base DbCommand abstraction
1 parent d3f3f4b commit 6625239

5 files changed

Lines changed: 73 additions & 0 deletions

File tree

src/CosmoSQLClient.MsSql/MsSqlParameter.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,25 @@ private static DbType InferDbType(Type type)
196196
_ => SqlDbType.Variant
197197
};
198198
}
199+
200+
/// <summary>
201+
/// Provides extension methods for <see cref="DbParameterCollection"/> to support <c>AddWithValue</c>
202+
/// even when the command is typed as the base <see cref="DbCommand"/>.
203+
/// </summary>
204+
public static class MsSqlParameterCollectionExtensions
205+
{
206+
/// <summary>
207+
/// Adds a parameter to the collection with the specified name and value.
208+
/// </summary>
209+
public static MsSqlParameter AddWithValue(this DbParameterCollection collection, string name, object? value)
210+
{
211+
if (collection is MsSqlParameterCollection msSqlCollection)
212+
{
213+
return msSqlCollection.AddWithValue(name, value);
214+
}
215+
216+
var p = new MsSqlParameter(name, value);
217+
collection.Add(p);
218+
return p;
219+
}
220+
}

src/CosmoSQLClient.MySql/MySqlCommand.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ public MySqlParameter AddWithValue(string name, object? value)
7171
internal IReadOnlyList<SqlParameter> ToCoreParameters() => _params.Select(p => p.ToCoreParameter()).ToList();
7272
}
7373

74+
public static class MySqlParameterCollectionExtensions
75+
{
76+
public static MySqlParameter AddWithValue(this DbParameterCollection collection, string name, object? value)
77+
{
78+
if (collection is MySqlParameterCollection mySqlCollection) return mySqlCollection.AddWithValue(name, value);
79+
var p = new MySqlParameter(name, value);
80+
collection.Add(p);
81+
return p;
82+
}
83+
}
84+
7485
public sealed class MySqlDataReader : DbDataReader
7586
{
7687
private readonly IReadOnlyList<SqlRow> _rows;

src/CosmoSQLClient.Postgres/PostgresParameter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,14 @@ private int GetIndex(string name)
111111

112112
internal IReadOnlyList<SqlParameter> ToCoreParameters() => _params.Select(p => p.ToCoreParameter()).ToList();
113113
}
114+
115+
public static class PostgresParameterCollectionExtensions
116+
{
117+
public static PostgresParameter AddWithValue(this DbParameterCollection collection, string name, object? value)
118+
{
119+
if (collection is PostgresParameterCollection pgCollection) return pgCollection.AddWithValue(name, value);
120+
var p = new PostgresParameter(name, value);
121+
collection.Add(p);
122+
return p;
123+
}
124+
}

src/CosmoSQLClient.Sqlite/SqliteCommand.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ public SqliteParameter AddWithValue(string name, object? value)
7171
internal IReadOnlyList<SqlParameter> ToCoreParameters() => _params.Select(p => p.ToCoreParameter()).ToList();
7272
}
7373

74+
public static class SqliteParameterCollectionExtensions
75+
{
76+
public static SqliteParameter AddWithValue(this DbParameterCollection collection, string name, object? value)
77+
{
78+
if (collection is SqliteParameterCollection sqliteCollection) return sqliteCollection.AddWithValue(name, value);
79+
var p = new SqliteParameter(name, value);
80+
collection.Add(p);
81+
return p;
82+
}
83+
}
84+
7485
public sealed class SqliteDataReader : DbDataReader
7586
{
7687
private readonly IReadOnlyList<SqlRow> _rows;

tests/CosmoSQLClient.MsSql.Tests/AdoNetTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@ public async Task StandardAdoNet_AddWithValue_ShouldWork()
113113
Assert.Equal("Hello AddWithValue", result);
114114
}
115115

116+
[Fact]
117+
public async Task StandardAdoNet_AddWithValue_Abstraction_ShouldWork()
118+
{
119+
if (ShouldSkip) return;
120+
121+
using DbConnection conn = new MsSqlConnection(ConnectionString);
122+
await conn.OpenAsync();
123+
124+
using DbCommand cmd = conn.CreateCommand();
125+
cmd.CommandText = "SELECT @val AS Echo";
126+
127+
// This tests the EXTENSION method on the base DbParameterCollection
128+
cmd.Parameters.AddWithValue("@val", "Hello Extension");
129+
130+
var result = await cmd.ExecuteScalarAsync();
131+
Assert.Equal("Hello Extension", result);
132+
}
133+
116134
[Fact]
117135
public async Task StandardAdoNet_Transactions_ShouldWork()
118136
{

0 commit comments

Comments
 (0)