2017-12-06 2 views
0

EDIT: Nach den Kommentaren zu urteilen, war ich unklar, was ich zu erreichen versuche. Ich werde es aus einem anderen Blickwinkel versuchen.Kann ich SQL mit Parametern innerhalb von Visual Studio ausführen?

Ich habe sprocs für eine Reihe von Jahren entwickelt. Ich habe zunehmend das Gefühl, dass die Wahl zwischen SQL, eingebettet in C# -Code und Sprocs, beide schlechte Entscheidungen sind. Ich weiß, dass viele Leute nicht zustimmen werden, und das ist in Ordnung. Darauf habe ich in der Frage nicht näher eingegangen, um zu vermeiden, dass die Diskussion über Sprocs geführt wird oder nicht :-).

Als ein Experiment habe ich versucht, .sql Dateien in meinem Projekt in Visual Studio einzubetten. Buchstäblich, in meinem Projektbaum habe ich Dateien mit der .sql Erweiterung und Build Action auf Embedded Resource festgelegt.

So kann ich den SQL-Abfragecode innerhalb von VS bearbeiten und sogar innerhalb von VS ausführen/ausführen, ohne das Projekt auszuführen. Ich liebe das. Der eigentliche Code, an dem ich gerade arbeite, ähnelt einer "Produktliste" mit Paging und mehreren Bestell- und Filteroptionen. Die SQL-Abfrage hat Parameter wie @skip, @search usw. Das bedeutet, wenn ich versuche, es innerhalb von VS (insbesondere durch Drücken CTRL + SHIFT + e oder Auswahl "Ausführen" aus dem Menü "SQL" in VS) ausführen/diese Parameter fehlen (natürlich), da sie zur Laufzeit als SqlParameter bereitgestellt werden sollen. Ich verstehe , warum dies passiert und keineswegs beabsichtigen zu implizieren, dass entweder VS oder SSMS abgehört wird. Ich bin nur auf der Suche nach einer Möglichkeit VS zu "sagen", dass "Wenn ich diese Abfrage innerhalb von VS ausführen, beabsichtige ich für @skip zu 10". Ich (vielleicht irrtümlich) vermutete, dass der Grund dafür, dass VS IntelliSense-Unterstützung und Execute-Unterstützung für .sql-Dateien hatte, darin bestand, ein Szenario zu unterstützen, das dem ähnlich ist, was ich versuche.

Ich habe nur gehofft, dass jemand anderes das Gleiche macht und einen cleveren Weg/Addon/Trick hat, um es zu unterstützen.

EDIT END

In einem Projekt in Visual Studio 2017 habe ich eine Reihe von SQL-Dateien, die in die Anwendung eingebettet werden, wenn gebaut.
Beim Bearbeiten der Dateien in VS kann ich bequem eine Verbindung zu einem SQL-Server herstellen und die Abfrage ausführen.
Wenn jedoch die Abfrageparameter wie folgt hat:

SELECT * FROM Employee WHERE [email protected]; 

Die Ausführung, in Visual Studio, nicht mit

Must declare the scalar variable "@ID". 

Dies kann „fixiert“ durch eine Linie an der Spitze Zugabe von das Skript/Datei, so dass es wie folgt aussieht:

DECLARE @ID int = 123; 
SELECT * FROM Employee WHERE [email protected]; 

aber jetzt ist es nicht, wenn aus dem Code wie folgt (unter Verwendung von Dapper genannt arbeiten, ist es nicht relevant th Frage e, aber erklärt die Syntax):

var emp = conn.Query<Employee>(sql, new { ID=123 }); 

Ich habe gehofft, dass ich entweder den Wert der ID angeben könnte irgendwo in der Datei nicht, oder einen Teil der Datei angeben, den VS ausführen würde, würde aber ignoriert später beim Aufruf aus dem Code.

EDIT: Um klar zu sein, kann ich die SQL erstellen, so dass es einwandfrei funktioniert innerhalb von Visual Studio oder zur Laufzeit, aber ich kann nicht beide haben. Ich hatte gehofft, dass es einen ordentlichen Hack, ein VS-Addon oder nur ein VS-Feature gab, das ich gerade vermisste. Ich habe als einen einfachen Pre-Prozessor hinzugefügt, damit ich etwas tun kann:

--if DEBUG 
DECLARE @ID int = 123; 
--endif 
SELECT * FROM Employee WHERE [email protected]; 

Und dann konnte ich es zu meiner Funktion hinzufügen, die die eingebetteten Ressource lädt.

+0

Kann nicht Sie speichern die SQL auf die Server als gespeicherte Prozeduren? –

+0

könnte ich aber lieber vermeiden. Wir müssen noch eine befriedigende Lösung für die DB-Versionskontrolle finden, also würde ich lieber keinen Code in der DB speichern. Außerdem, wie würde mir das helfen, es in VS zu bearbeiten und auszuführen? –

+0

Mögliches Duplikat von [Abfrage mit Parametern ausführen] (https://stackoverflow.com/questions/11905185/executing-query-with-parameters) –

Antwort

1

Verzeihung, wenn ich die Frage falsch verstanden habe. Kann es sein, dass du nach so etwas suchst? Die Abfrage Ansatz spielt eigentlich keine Rolle, es sieht aus wie das Problem ist, dass Sie es wie @ID erklären, wenn Sie tatsächlich den Ersatz für das Skript selbst hinzufügen

con.Open(); 
SqlCommand cmd = con.CreateCommand(); 
cmd.CommandText = "SELECT * FROM Employee WHERE [email protected];"; 
cmd.Parameters.Add("@ID", actualID); <--this is is why declaring doesn't work - You can declare it, but you also need to add it to the query 
SqlDataReader rdr = cmd.ExecuteReader(); 
+0

Hinweis: hier ist schon alles was Dapper (der Code in der Frage) schon getan hätte. Es gibt also nichts * falsch * mit dem Code in dieser Antwort - es ändert auch nichts von dem, was in der Frage ist –

+0

Mein Punkt ist, die SQL in Ihrem Beispiel ist nicht ausführbar von innerhalb von VS oder SSMS, wird es beschweren @ID ist nicht deklariert. In meinem tatsächlichen Code ist 'CommandText' vielleicht 50 Zeilen lang und befindet sich in einer Datei mit der Erweiterung' .sql'. Ich kann diese Datei von SQL innerhalb von VS über das Menü SQL -> Execute ausführen, aber nur, wenn keine nicht deklarierten Parameter vorhanden sind. –

Verwandte Themen