Benutzer mit den meisten Antworten
WPF - Entity Framework - Gespeicherte Prozedur - Übergabe Where Klausel

Frage
-
Hallo,
ich nutze gespeicherte Prozeduren mit einem Entity Framework (wpf).
Ich habe eine Abfrage in der ich gerne die Where Clausel im Code zusammenstellen lassen würde und dann an die gespeicherte Prozedur übergeben würde.
Funktioniert so etwas überhaupt?
Danke
Ralf
Antworten
-
Hallo Ralf,
eine gespeicherte Prozedur mit Übergabe einer dynamischen WHERE Klausel ist ein Widerspruch an sich. Du könntest ebenso auf die Prozedur verzichten, da Du weder die zusätzliche Sicherheit noch die zusätzliche Performance einer Prozedur bekommst.
Die einzige Möglichkeit wäre die Übergabe einer Zeichenkette, die an die Basis-SQL Zeichenfolge angehängt wird. Und dann mit sp_excecutesql ausgeführt wird, wobei man die Parameter mitgeben kann.
Gleiches kann man kontrollierter in der Prozedur abwickeln, wobei hier das am Anfang gesagte gilt, siehe dazu Erland Sommarskog: The Curse and Blessings of Dynamic SQL. Die deutsche Fassung ist etwas veraltet gilt aber im wesentlichen noch. Ggf. kann man aus dem C# Code etwas Unterstützung geben, indem man übergibt, welche Parameter verwendet werden.
Gruß Elmar
- Als Antwort markiert Joe72ka Freitag, 19. August 2016 11:33
Alle Antworten
-
Hallo Ralf,
eine gespeicherte Prozedur mit Übergabe einer dynamischen WHERE Klausel ist ein Widerspruch an sich. Du könntest ebenso auf die Prozedur verzichten, da Du weder die zusätzliche Sicherheit noch die zusätzliche Performance einer Prozedur bekommst.
Die einzige Möglichkeit wäre die Übergabe einer Zeichenkette, die an die Basis-SQL Zeichenfolge angehängt wird. Und dann mit sp_excecutesql ausgeführt wird, wobei man die Parameter mitgeben kann.
Gleiches kann man kontrollierter in der Prozedur abwickeln, wobei hier das am Anfang gesagte gilt, siehe dazu Erland Sommarskog: The Curse and Blessings of Dynamic SQL. Die deutsche Fassung ist etwas veraltet gilt aber im wesentlichen noch. Ggf. kann man aus dem C# Code etwas Unterstützung geben, indem man übergibt, welche Parameter verwendet werden.
Gruß Elmar
- Als Antwort markiert Joe72ka Freitag, 19. August 2016 11:33
-
Hallo Elmar,
ich hab das zwar jetzt umgesetzt und im Management Studio funktioniert es auch.
EXEC sp_executesql @sql, @paramlist,
@Archiv, @StJahrFilter, @ADatumFilter, @EDatumFilterAber wenn ich es mit dem Entity einbinde dann erscheint kein Result in der edmx Datei.
Was mach ich denn falsch?
Grüße
Ralf
-
Hallo Ralf,
was machst Du wie und wo mit dem Entity (Framework?)? Welche Version? 6, 7, ...?
Was genau macht die SP überhaupt? Poste bitte mal die vollständige Deklaration ab CREATE PROCEDURE ...
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Donnerstag, 18. August 2016 22:21
-
Hallo Stefan,
Entity Version 6
Im Visual Studiofüge ich über neues Objekt Daten - Ado.net die Gespeicherte Prozedur dem Projekt hinzu.
Danach nehme ich es als Grundlage für ein Datagrid.
Hier einmal die gespeicherte Prozedur:
ALTER PROC [dbo].[qryStammTermine1] @Filter varchar(200), @Archiv bit, @StJahr bit, @StJahrFilter varchar(50), @Bereich bit, @BereichFilter varchar(50), @Kurs bit, @KursFilter varchar(50), @Datum bit, @ADatumFilter date, @EDatumFilter date AS DECLARE @sql nvarchar(MAX), @paramlist nvarchar(4000), @nl char(2) = char(13) + char(10) SELECT @sql = ' SELECT * FROM dbo.tblStammFBTermine WHERE boolArchiv = ' + convert(varchar(10), @Archiv) IF @StJahr = 1 SELECT @sql = @sql + ' AND strStudienjahr LIKE @StJahrFilter ' + @nl IF @Kurs = 1 SELECT @sql = @sql + ' AND strVerNr LIKE @KursFilter + ''%''' + @nl IF @Datum = 1 SELECT @sql = @sql + ' AND dateDatum >= @ADatumFilter' + @nl SELECT @sql = @sql + ' AND dateDatum <= @EDatumFilter' + @nl SELECT @paramlist = '@boolArchiv bit, @StJahrFilter nvarchar(50), @ADatumFilter datetime, @EDatumFilter datetime' EXEC sp_executesql @sql, @paramlist, @Archiv, @StJahrFilter, @ADatumFilter, @EDatumFilter
Danke
Ralf
-
Hallo Ralf,
damit Du die Prozedur nutzen kannst, musst Du sie bekannt machen, siehe dazu
und auch How to: Import a Stored Procedure (Entity Data Model Tools).
Zu der Prozedur selbst: Da .NET Unicode verwendet und auch sp_executesql, solltest Du die Parameter durchweg als NVARCHAR definieren, dass vermeidet unnötige Konvertierungen (und vermeidet ggf. auch Fehler). @nl wäre NCHAR(13) + NCHAR(10). Die Zeichenfolgen selbst sollten mit dem Präfix N' anfangen, also N'SELECT ...'.
Beim boolArchiv solltest Du ebenfalls den Parameter verwenden und nicht anhängen. Es empfiehlt sich, für die Parameter Standardwerte (und sei es NULL) festzulegen, so kann man die Prozedur ohne vollständige Parameterangaben testen.
Am Beginn sollte SET NOCOUNT ON; stehen, um unnötige Resultsets zu vermeiden.