Skip to content

Commit 25d75e6

Browse files
committed
Add 'public new' convenience methods. Fixes #313
1 parent 5da5603 commit 25d75e6

File tree

4 files changed

+72
-14
lines changed

4 files changed

+72
-14
lines changed

src/MySqlConnector/MySqlClient/MySqlCommand.cs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Data;
33
using System.Data.Common;
44
using System.Threading;
@@ -34,8 +34,8 @@ public MySqlCommand(string commandText, MySqlConnection connection, MySqlTransac
3434
{
3535
CommandId = Interlocked.Increment(ref s_commandId);
3636
CommandText = commandText;
37-
DbConnection = connection;
38-
DbTransaction = transaction;
37+
Connection = connection;
38+
Transaction = transaction;
3939
m_parameterCollection = new MySqlParameterCollection();
4040
CommandType = CommandType.Text;
4141
}
@@ -49,6 +49,8 @@ public MySqlCommand(string commandText, MySqlConnection connection, MySqlTransac
4949
}
5050
}
5151

52+
public new MySqlParameter CreateParameter() => (MySqlParameter) base.CreateParameter();
53+
5254
public override void Cancel() => Connection.Cancel(this);
5355

5456
public override int ExecuteNonQuery() =>
@@ -57,6 +59,10 @@ public override int ExecuteNonQuery() =>
5759
public override object ExecuteScalar() =>
5860
ExecuteScalarAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
5961

62+
public new MySqlDataReader ExecuteReader() => (MySqlDataReader) base.ExecuteReader();
63+
64+
public new MySqlDataReader ExecuteReader(CommandBehavior commandBehavior) => (MySqlDataReader) base.ExecuteReader(commandBehavior);
65+
6066
public override void Prepare()
6167
{
6268
// NOTE: Prepared statements in MySQL are not currently supported.
@@ -67,6 +73,8 @@ public override void Prepare()
6773

6874
public override string CommandText { get; set; }
6975
public override int CommandTimeout { get; set; }
76+
public new MySqlConnection Connection { get; set; }
77+
public new MySqlTransaction Transaction { get; set; }
7078

7179
public override CommandType CommandType
7280
{
@@ -99,9 +107,19 @@ public override UpdateRowSource UpdatedRowSource
99107

100108
public long LastInsertedId { get; internal set; }
101109

102-
protected override DbConnection DbConnection { get; set; }
110+
protected override DbConnection DbConnection
111+
{
112+
get => Connection;
113+
set => Connection = (MySqlConnection) value;
114+
}
115+
103116
protected override DbParameterCollection DbParameterCollection => m_parameterCollection;
104-
protected override DbTransaction DbTransaction { get; set; }
117+
118+
protected override DbTransaction DbTransaction
119+
{
120+
get => Transaction;
121+
set => Transaction = (MySqlTransaction) value;
122+
}
105123

106124
protected override DbParameter CreateDbParameter()
107125
{
@@ -148,8 +166,6 @@ protected override void Dispose(bool disposing)
148166
}
149167
}
150168

151-
internal new MySqlConnection Connection => (MySqlConnection) DbConnection;
152-
153169
/// <summary>
154170
/// Registers <see cref="Cancel"/> as a callback with <paramref name="token"/> if cancellation is supported.
155171
/// </summary>
@@ -180,11 +196,11 @@ private bool IsValid(out Exception exception)
180196
exception = null;
181197
if (m_parameterCollection == null)
182198
exception = new ObjectDisposedException(GetType().Name);
183-
else if (DbConnection == null)
199+
else if (Connection == null)
184200
exception = new InvalidOperationException("Connection property must be non-null.");
185-
else if (DbConnection.State != ConnectionState.Open && DbConnection.State != ConnectionState.Connecting)
186-
exception = new InvalidOperationException("Connection must be Open; current state is {0}".FormatInvariant(DbConnection.State));
187-
else if (DbTransaction != Connection.CurrentTransaction)
201+
else if (Connection.State != ConnectionState.Open && Connection.State != ConnectionState.Connecting)
202+
exception = new InvalidOperationException("Connection must be Open; current state is {0}".FormatInvariant(Connection.State));
203+
else if (Transaction != Connection.CurrentTransaction)
188204
exception = new InvalidOperationException("The transaction associated with this command is not the connection's active transaction.");
189205
else if (string.IsNullOrWhiteSpace(CommandText))
190206
exception = new InvalidOperationException("CommandText must be specified");

src/MySqlConnector/MySqlClient/MySqlConnection.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Data;
44
using System.Data.Common;
@@ -22,6 +22,8 @@ public MySqlConnection()
2222

2323
public new MySqlTransaction BeginTransaction() => (MySqlTransaction) base.BeginTransaction();
2424

25+
public new MySqlTransaction BeginTransaction(IsolationLevel isolationLevel) => (MySqlTransaction) base.BeginTransaction(isolationLevel);
26+
2527
public Task<MySqlTransaction> BeginTransactionAsync(CancellationToken cancellationToken = default(CancellationToken)) =>
2628
BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, cancellationToken);
2729

@@ -129,6 +131,8 @@ private async Task ChangeDatabaseAsync(IOBehavior ioBehavior, string databaseNam
129131
m_session.DatabaseOverride = databaseName;
130132
}
131133

134+
public new MySqlCommand CreateCommand() => (MySqlCommand) base.CreateCommand();
135+
132136
public override void Open() => OpenAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
133137

134138
public override Task OpenAsync(CancellationToken cancellationToken) =>

src/MySqlConnector/MySqlClient/MySqlParameterCollection.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Data;
@@ -142,6 +142,12 @@ protected override void SetParameter(int index, DbParameter value)
142142
set => SetParameter(index, value);
143143
}
144144

145+
public new MySqlParameter this[string name]
146+
{
147+
get => (MySqlParameter) GetParameter(name);
148+
set => SetParameter(name, value);
149+
}
150+
145151
private void AddParameter(MySqlParameter parameter)
146152
{
147153
m_parameters.Add(parameter);

tests/SideBySide/QueryTests.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Data;
44
using System.Linq;
@@ -763,6 +763,38 @@ public void Int64EnumParameter()
763763
}
764764
}
765765

766+
[Fact]
767+
public void ReturnDerivedTypes()
768+
{
769+
using (MySqlTransaction transaction = m_database.Connection.BeginTransaction())
770+
using (MySqlCommand command = m_database.Connection.CreateCommand())
771+
{
772+
command.CommandText = "select @param + @param2";
773+
774+
MySqlParameter parameter = command.CreateParameter();
775+
parameter.ParameterName = "param";
776+
parameter.Value = 1;
777+
MySqlParameterCollection parameterCollection = command.Parameters;
778+
parameterCollection.Add(parameter);
779+
780+
MySqlParameter parameter2 = parameterCollection.AddWithValue("param2", 2);
781+
782+
MySqlParameter parameterB = parameterCollection[0];
783+
Assert.Same(parameter, parameterB);
784+
MySqlParameter parameter2B = parameterCollection["param2"];
785+
Assert.Same(parameter2, parameter2B);
786+
787+
using (MySqlDataReader reader = command.ExecuteReader())
788+
{
789+
Assert.True(reader.Read());
790+
Assert.Equal(3L, reader.GetValue(0));
791+
Assert.False(reader.Read());
792+
}
793+
794+
transaction.Rollback();
795+
}
796+
}
797+
766798
class BoolTest
767799
{
768800
public int Id { get; set; }

0 commit comments

Comments
 (0)