1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using Dapper ;
3
4
using MySql . Data . MySqlClient ;
4
5
using Xunit ;
5
6
@@ -11,6 +12,79 @@ public PreparedCommandTests(DatabaseFixture database)
11
12
{
12
13
}
13
14
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
+
14
88
[ Theory ]
15
89
[ MemberData ( nameof ( GetInsertAndQueryData ) ) ]
16
90
public void InsertAndQuery ( bool isPrepared , string dataType , object dataValue )
@@ -22,11 +96,8 @@ public void InsertAndQuery(bool isPrepared, string dataType, object dataValue)
22
96
using ( var connection = new MySqlConnection ( csb . ConnectionString ) )
23
97
{
24
98
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 } );" ) ;
30
101
31
102
using ( var command = new MySqlCommand ( "INSERT INTO prepared_command_test(data) VALUES(@null), (@data);" , connection ) )
32
103
{
@@ -104,5 +175,13 @@ public static IEnumerable<object[]> GetInsertAndQueryData()
104
175
yield return new object [ ] { isPrepared , "JSON" , "{\" test\" : true}" } ;
105
176
}
106
177
}
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
+ }
107
186
}
108
187
}
0 commit comments