@@ -140,7 +140,36 @@ public async Task PrepareAsync(IMySqlCommand command, IOBehavior ioBehavior, Can
140140 // caller has validated this already
141141 var commandText = command . CommandText ! ;
142142
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 ( ) ) ;
144173 var parsedStatements = statementPreparer . SplitStatements ( ) ;
145174
146175 var columnsAndParameters = new ResizableArray < byte > ( ) ;
0 commit comments