2016-06-20 4 views
0

ich einen SQL-Befehl Text wie diese haben (es könnte mehr Parameter sein)Extract Parameter und ihre Werte von einem Inline-SQL-Aufruf der gespeicherten Prozedur mit C#

dbo.storedProcedure @JobID = 1, @JobName = 'xyz' 

ich die Parameterwerte und Namen in einigen bekommen Art von Sammlung, die ich dann durchschleifen und sie als SqlParameter s hinzufügen kann.

Zum Beispiel:

foreach (Param in parameters) 
{ 
    cmd.Parameters.AddWithValue(param.Name, Param.Val) 
} 

I werden dann die Parameter aus dem Befehlstext entfernen d.h. dbo.storedProcedure.

Der Grund, warum ich dies tun möchte, ist, weil ich den 'ReturnValue' von der Prozedur will. Ich weiß, ich könnte einfach CommandType.Text verwenden und den Befehlstext so übergeben, aber ich bekomme immer 0 als Rückgabewert, wenn ich es so mache.

Wenn ich CommandType = CommandType.StoredProcedure einstelle und auch einen Parameter mit ReturnValue Richtung verwende, bekomme ich den korrekten Rückgabewert von der Prozedur.

Ich fand das sehr nahe, aber gibt mir nur die Parameternamen. Ich möchte auch die Werte.

C# Parse SQL statement to use parameters

Dank

+0

Ich verstehe nicht, was Sie zu tun versuchen Hier. Ihr Befehl hat bereits die Parameter, so dass das Hinzufügen als Aktualparameter Probleme verursacht. Sie müssen auch den Befehlstext ändern. Außerdem müssen Sie den Befehlstyp für die Speicherung von proc ändern. Ich denke, Sie müssen ein bisschen mehr Details bereitstellen, bevor wir wirklich helfen können. –

+0

Danke Sean - Ich habe die Frage aktualisiert, um zu erklären, warum ich den Befehlstext nicht so verwenden kann wie er ist. – user3781891

+0

Wenn Sie den ReturnValue verwenden, machen Sie wahrscheinlich etwas falsch. Die Rückkehr von einer gespeicherten Prozedur wird verwendet, um den Status der Ausführung anzuzeigen.Wenn Sie Werte ausschließen möchten, sollten Sie OUTPUT-Parameter verwenden. –

Antwort

0

Dadurch werden alle gespeicherten Prozeduren und Funktionen mit ihren Parametern auflisten. Ich vermute, dass Sie auf Ihre Bedürfnisse

SELECT SCHEMA_NAME(SCHEMA_ID) AS [Schema], 
     SO.name AS [ObjectName], 
     SO.Type_Desc AS [ObjectType (UDF/SP)], 
     P.parameter_id AS [ParameterID], 
     P.name AS [ParameterName], 
     TYPE_NAME(P.user_type_id) AS [ParameterDataType], 
     P.max_length AS [ParameterMaxBytes], 
     P.is_output AS [IsOutPutParameter] 
    FROM sys.objects AS SO 
    INNER JOIN sys.parameters AS P ON SO.OBJECT_ID = P.OBJECT_ID 
    WHERE SO.OBJECT_ID IN (SELECT OBJECT_ID FROM sys.objects WHERE TYPE IN ('P','FN')) 
    ORDER BY [Schema], SO.name, P.parameter_id 
1
string commandText = "dbo.storedPorc @JobID=1, @JobName='xyz'" 
string paramsX = commandText.Substring(commandText.IndexOf(' ') + 1); 

Dictionary<string,string> parameters = new Dictionary<string,string>(); 
foreach(var s in paramsX.Split(',')) 
{ 
    var finalParams = s.Split('='); 
    parameters.Add(s[0],s[1].Replace("'",string.Empty);); 
} 

Dieses dieses Wörterbuch anpassen können Sie auf diese Weise

foreach (KeyValuePair<string,string> param in parameters) 
{ 
    cmd.Parameters.AddWithValue(param.Key, param.Value) 
} 
0

1) Ich möchte vermeiden, AddWithValue verwenden kann, weil sie Abfrage-Plan-Cache polution

erzeugt

http://www.sqlpassion.at/archive/2015/07/20/how-to-pollute-your-plan-cache-with-parameterized-sql-statements/

2) Wenn ich pas muss s Standardwert eine einfache Lösung für param ist DEFAULT-Schlüsselwort zu verwenden, so Exec dbo.proc @param1=123,@param2=DEFAULT

In C#/VB würde ich folgende Lösung verwenden: How do you specify 'DEFAULT' as a SQL parameter value in ADO.NET?

Bassicaly, ich habe nicht diesen Standardwert zu kennen.

3) Wenn Sie Prozedur Quellcode analysieren wollen, dass diese Standardwerte, um herauszufinden, dann sollten Sie TSQLScriptDom API verwenden (Sie könnten mit diesem Beispiel https://blogs.msdn.microsoft.com/arvindsh/2013/04/04/using-the-transactsql-scriptdom-parser-to-get-statement-counts/) beginnen

Verwandte Themen