11using System ;
22using System . Collections . Generic ;
3+ using Dapper ;
34using MySql . Data . MySqlClient ;
45using 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