Skip to content

Commit 3f78c59

Browse files
committed
Fix exception when OUT parameter is NULL. Fixes #425
1 parent 89d4634 commit 3f78c59

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

src/MySqlConnector/Core/StoredProcedureCommandExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ internal void SetParams()
102102
for (var i = 0; i < m_outParams.Count; i++)
103103
{
104104
var param = m_outParams[i];
105-
if (param.HasSetDbType)
105+
if (param.HasSetDbType && !reader.IsDBNull(i))
106106
{
107107
var dbTypeMapping = TypeMapper.Instance.GetDbTypeMapping(param.DbType);
108108
if (dbTypeMapping != null)

tests/SideBySide/StoredProcedureFixture.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ OUT value VARCHAR(100)
5555
BEGIN
5656
SELECT 'test value' INTO value;
5757
END");
58+
Connection.Execute(@"DROP PROCEDURE IF EXISTS out_null;
59+
CREATE PROCEDURE out_null(
60+
OUT string_value VARCHAR(100),
61+
OUT int_value INT
62+
)
63+
BEGIN
64+
SELECT NULL INTO string_value;
65+
SELECT NULL INTO int_value;
66+
END");
5867
Connection.Execute(@"drop table if exists sproc_multiple_rows;
5968
create table sproc_multiple_rows (
6069
value integer not null primary key auto_increment,

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,36 @@ public async Task StoredProcedureOutIncorrectType()
135135
}
136136
}
137137

138+
[Fact]
139+
public async Task StoredProcedureReturnsNull()
140+
{
141+
using (var cmd = m_database.Connection.CreateCommand())
142+
{
143+
cmd.CommandText = "out_null";
144+
cmd.CommandType = CommandType.StoredProcedure;
145+
cmd.Parameters.Add(new MySqlParameter
146+
{
147+
ParameterName = "@string_value",
148+
DbType = DbType.String,
149+
Direction = ParameterDirection.Output,
150+
IsNullable = true,
151+
Value = "non null",
152+
});
153+
cmd.Parameters.Add(new MySqlParameter
154+
{
155+
ParameterName = "@int_value",
156+
DbType = DbType.Int32,
157+
Direction = ParameterDirection.Output,
158+
IsNullable = true,
159+
Value = "123",
160+
});
161+
await cmd.ExecuteNonQueryAsync();
162+
163+
Assert.Equal(DBNull.Value, cmd.Parameters["@string_value"].Value);
164+
Assert.Equal(DBNull.Value, cmd.Parameters["@int_value"].Value);
165+
}
166+
}
167+
138168
[Theory]
139169
[InlineData("NonQuery")]
140170
[InlineData("Scalar")]

0 commit comments

Comments
 (0)