@@ -140,7 +140,36 @@ public async Task PrepareAsync(IMySqlCommand command, IOBehavior ioBehavior, Can
140
140
// caller has validated this already
141
141
var commandText = command . CommandText ! ;
142
142
143
- var statementPreparer = new StatementPreparer ( commandText , command . RawParameters , command . CreateStatementPreparerOptions ( ) ) ;
143
+ // for a stored procedure, the statement to be prepared is "CALL commandText(?,?,?,...);"
144
+ string commandToPrepare ;
145
+ if ( command . CommandType == CommandType . StoredProcedure )
146
+ {
147
+ var cachedProcedure = await command . Connection ! . GetCachedProcedure ( commandText , revalidateMissing : false , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
148
+ if ( cachedProcedure is null )
149
+ {
150
+ var name = NormalizedSchema . MustNormalize ( command . CommandText ! , command . Connection . Database ) ;
151
+ throw new MySqlException ( "Procedure or function '{0}' cannot be found in database '{1}'." . FormatInvariant ( name . Component , name . Schema ) ) ;
152
+ }
153
+
154
+ var parameterCount = cachedProcedure . Parameters . Count ;
155
+ var callStatement = new StringBuilder ( "CALL " , commandText . Length + 8 + parameterCount * 2 ) ;
156
+ callStatement . Append ( commandText ) ;
157
+ callStatement . Append ( '(' ) ;
158
+ for ( int i = 0 ; i < parameterCount ; i ++ )
159
+ callStatement . Append ( "?," ) ;
160
+ if ( parameterCount == 0 )
161
+ callStatement . Append ( ')' ) ;
162
+ else
163
+ callStatement [ callStatement . Length - 1 ] = ')' ;
164
+ callStatement . Append ( ';' ) ;
165
+ commandToPrepare = callStatement . ToString ( ) ;
166
+ }
167
+ else
168
+ {
169
+ commandToPrepare = commandText ;
170
+ }
171
+
172
+ var statementPreparer = new StatementPreparer ( commandToPrepare , command . RawParameters , command . CreateStatementPreparerOptions ( ) ) ;
144
173
var parsedStatements = statementPreparer . SplitStatements ( ) ;
145
174
146
175
var columnsAndParameters = new ResizableArray < byte > ( ) ;
0 commit comments