Ich kann mir auch nicht vorstellen, dass diese Art der Programmierung bei einem SQL-Server unkritisch sein soll.

Und was die "schnelle" Entwicklung angeht, so unterstützt doch gerade .NET die automatische Generierung von Typed-Datasets, Command's, DataAdapter usw. die dann gerade mit parametrierten Command's arbeitet.
Die Entwicklungszeit reduziert sich damit z.T. drastisch, weil mir .NET erheblich Arbeit abnimmt.
Dies ist dann auch meist so datenbankneutral, dass der simple Austausch der Connection dann mit jedem System funktioniert.

Ausserdem führst du hier Trigger auf. Auch diese können "schlecht" und damit unperformant realisiert sein und zur Bremse werden.

Wie gesagt, eine "schnelle" Programmierung setzt sowieso den Einsatz einer toolgestützten Entwicklung voraus um
a) schneller fertig zu werden
b) performante SQL's zu erstellen
c) Dokumentation zu automatisieren
d) ... und viele weitere Gründe

Ein Quick-und-Dirty zusammengeschusterter SQL ist nie eine langfristig performante Angelegenheit.

Ggf. untersuche mal die Sperren eines QZDASOINIT-Job's und suche nach der Art *SQLPKG (meist in der QGPL angelegt).
Per PRTSQLINF kannst du dir dann die SQL-Befehle und die gespeicherten Zugriffspfade ansehen.

Anmerkung:
Häufig wird auch vergessen, den .NET-DataReader nach EOF (Fill-Methode) zu schliessen und zu disposen, was dazu führt, dass bei wiederholtem Ausführen des Commands mit einem neuen DataReader auch die Datei (ODP, Cursor) nicht wiederverwendet werden kann (der Cursor ist ja noch offen).
Auch dies führt zu nicht unerheblichen Performanceverlusten.