Skip to content

Commit af35129

Browse files
committed
Add more prepared command tests.
1 parent dea490c commit af35129

File tree

1 file changed

+84
-5
lines changed

1 file changed

+84
-5
lines changed

tests/SideBySide/PreparedCommandTests.cs

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using Dapper;
34
using MySql.Data.MySqlClient;
45
using Xunit;
56

@@ -11,6 +12,79 @@ public PreparedCommandTests(DatabaseFixture database)
1112
{
1213
}
1314

15+
[SkippableFact(Baseline = "Parameter '@data' was not found during prepare.")]
16+
public void PrepareBeforeBindingParameters()
17+
{
18+
using (var connection = CreatePrepareConnection())
19+
{
20+
connection.Execute($@"DROP TABLE IF EXISTS bind_parameters_test;
21+
CREATE TABLE bind_parameters_test(data TEXT NOT NULL);");
22+
23+
using (var command = new MySqlCommand(@"INSERT INTO bind_parameters_test(data) VALUES(@data);", connection))
24+
{
25+
command.Prepare();
26+
command.Parameters.AddWithValue("@data", "test");
27+
command.ExecuteNonQuery();
28+
}
29+
30+
Assert.Equal(new[] { "test" }, connection.Query<string>("SELECT data FROM bind_parameters_test;"));
31+
}
32+
}
33+
34+
[SkippableFact(Baseline = "https://bugs.mysql.com/bug.php?id=91753")]
35+
public void UnnamedParameters()
36+
{
37+
using (var connection = CreatePrepareConnection())
38+
{
39+
connection.Execute($@"DROP TABLE IF EXISTS bind_parameters_test;
40+
CREATE TABLE bind_parameters_test(data1 TEXT NOT NULL, data2 INTEGER);");
41+
42+
using (var command = new MySqlCommand(@"INSERT INTO bind_parameters_test(data1, data2) VALUES(?, ?);", connection))
43+
{
44+
command.Parameters.Add(new MySqlParameter { Value = "test" });
45+
command.Parameters.Add(new MySqlParameter { Value = 1234 });
46+
command.Prepare();
47+
command.ExecuteNonQuery();
48+
}
49+
50+
using (var command = new MySqlCommand(@"SELECT data1, data2 FROM bind_parameters_test;", connection))
51+
{
52+
command.Prepare();
53+
using (var reader = command.ExecuteReader())
54+
{
55+
Assert.True(reader.Read());
56+
Assert.Equal("test", reader.GetValue(0));
57+
Assert.Equal(1234, reader.GetValue(1));
58+
}
59+
}
60+
}
61+
}
62+
63+
[Fact]
64+
public void ReuseCommand()
65+
{
66+
using (var connection = CreatePrepareConnection())
67+
{
68+
connection.Execute($@"DROP TABLE IF EXISTS reuse_command_test;
69+
CREATE TABLE reuse_command_test(rowid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, data TEXT NOT NULL);");
70+
71+
using (var command = new MySqlCommand(@"INSERT INTO reuse_command_test(data) VALUES(@data);", connection))
72+
{
73+
// work around Connector/NET failure; see PrepareBeforeBindingParameters
74+
var parameter = command.Parameters.AddWithValue("@data", "");
75+
command.Prepare();
76+
77+
foreach (var value in new[] { "one", "two", "three" })
78+
{
79+
parameter.Value = value;
80+
command.ExecuteNonQuery();
81+
}
82+
}
83+
84+
Assert.Equal(new[] { "one", "two", "three" }, connection.Query<string>("SELECT data FROM reuse_command_test ORDER BY rowid;"));
85+
}
86+
}
87+
1488
[Theory]
1589
[MemberData(nameof(GetInsertAndQueryData))]
1690
public void InsertAndQuery(bool isPrepared, string dataType, object dataValue)
@@ -22,11 +96,8 @@ public void InsertAndQuery(bool isPrepared, string dataType, object dataValue)
2296
using (var connection = new MySqlConnection(csb.ConnectionString))
2397
{
2498
connection.Open();
25-
using (var command = new MySqlCommand($@"DROP TABLE IF EXISTS prepared_command_test;
26-
CREATE TABLE prepared_command_test(rowid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, data {dataType});", connection))
27-
{
28-
command.ExecuteNonQuery();
29-
}
99+
connection.Execute($@"DROP TABLE IF EXISTS prepared_command_test;
100+
CREATE TABLE prepared_command_test(rowid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, data {dataType});");
30101

31102
using (var command = new MySqlCommand("INSERT INTO prepared_command_test(data) VALUES(@null), (@data);", connection))
32103
{
@@ -104,5 +175,13 @@ public static IEnumerable<object[]> GetInsertAndQueryData()
104175
yield return new object[] { isPrepared, "JSON", "{\"test\": true}" };
105176
}
106177
}
178+
179+
private static MySqlConnection CreatePrepareConnection()
180+
{
181+
var csb = new MySqlConnectionStringBuilder(AppConfig.ConnectionString) { IgnorePrepare = false };
182+
var connection = new MySqlConnection(csb.ConnectionString);
183+
connection.Open();
184+
return connection;
185+
}
107186
}
108187
}

0 commit comments

Comments
 (0)