Skip to content

Commit 6e702cb

Browse files
committed
added AppendStoredProcedureCall
1 parent 69502b3 commit 6e702cb

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

src/FirebirdSql.EntityFrameworkCore.Firebird/Update/Internal/FbUpdateSqlGenerator.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
using System;
1919
using System.Collections.Generic;
20+
using System.Data;
2021
using System.Linq;
2122
using System.Text;
2223
using FirebirdSql.EntityFrameworkCore.Firebird.Storage.Internal;
@@ -252,4 +253,68 @@ void AppendSqlLiteral(StringBuilder commandStringBuilder, object value, IPropert
252253
mapping ??= Dependencies.TypeMappingSource.GetMappingForValue(value);
253254
commandStringBuilder.Append(mapping.GenerateProviderValueSqlLiteral(value));
254255
}
256+
257+
public override ResultSetMapping AppendStoredProcedureCall(
258+
StringBuilder commandStringBuilder,
259+
IReadOnlyModificationCommand command,
260+
int commandPosition,
261+
out bool requiresTransaction)
262+
{
263+
var storedProcedure = command.StoreStoredProcedure;
264+
var resultSetMapping = ResultSetMapping.NoResults;
265+
266+
foreach (var resultColumn in storedProcedure.ResultColumns)
267+
{
268+
resultSetMapping = ResultSetMapping.LastInResultSet;
269+
if (resultColumn == command.RowsAffectedColumn)
270+
{
271+
resultSetMapping |= ResultSetMapping.ResultSetWithRowsAffectedOnly;
272+
}
273+
else
274+
{
275+
resultSetMapping = ResultSetMapping.LastInResultSet;
276+
break;
277+
}
278+
}
279+
280+
commandStringBuilder.Append("EXECUTE PROCEDURE ");
281+
SqlGenerationHelper.DelimitIdentifier(commandStringBuilder, storedProcedure.Name);
282+
283+
if (storedProcedure.Parameters.Any())
284+
{
285+
commandStringBuilder.Append(" ");
286+
var first = true;
287+
288+
for (var i = 0; i < command.ColumnModifications.Count; i++)
289+
{
290+
var columnModification = command.ColumnModifications[i];
291+
if (columnModification.Column is not IStoreStoredProcedureParameter parameter)
292+
{
293+
continue;
294+
}
295+
296+
if (parameter.Direction.HasFlag(ParameterDirection.Output))
297+
{
298+
continue;
299+
}
300+
301+
if (first)
302+
{
303+
first = false;
304+
}
305+
else
306+
{
307+
commandStringBuilder.Append(", ");
308+
}
309+
SqlGenerationHelper.GenerateParameterNamePlaceholder(
310+
commandStringBuilder, columnModification.UseOriginalValueParameter
311+
? columnModification.OriginalParameterName!
312+
: columnModification.ParameterName!);
313+
}
314+
}
315+
316+
commandStringBuilder.AppendLine(SqlGenerationHelper.StatementTerminator);
317+
requiresTransaction = true;
318+
return resultSetMapping;
319+
}
255320
}

0 commit comments

Comments
 (0)