Laden...

Stored Procedure - Übergabe von mehreren Parametern

Erstellt von sailer1986 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.550 Views
S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren
Stored Procedure - Übergabe von mehreren Parametern

verwendetes Datenbanksystem: <SQL Server 2005>

Hi,

ich probiere die ganze Zeit einer Stored Procedure zwei Werte zu übergeben. In meinem Reader Objekt sind auch zwei drin aber es kommt trotzdem immer eine Fehlermeldung.

Meine Stored Procedure in der DB sieht so aus:



ALTER PROCEDURE [dbo].[thesis_select_Station]
	@ort varchar(50),
	@transport varchar(50)	

AS
BEGIN	
               SELECT S.ort,  P.transport, P.platz FROM test AS S, test1 AS P WHERE S.ort = @ort AND P.parent = @ort AND P.transport= @transport
END

In C# probiere ich das ganze folgendermaßen aufzurufen:



                int spalten_nr = 1;
                string storedProcedure = elementtyp.Attributes["SelectStatements"].InnerText.ToString();
                SqlCommand sqlCommand = new SqlCommand(storedProcedure, ConnectionOptionen.verb);
                sqlCommand.CommandType = CommandType.StoredProcedure;

   
                sqlCommand.Parameters.Add(ortskoordinateForm.dbName, SqlDbType.VarChar, 100);
                 sqlCommand.Parameters[ortskoordinateForm.dbName].Value = ortskoordinateForm.wertdesParameters.Text.ToString();


                sqlCommand.Parameters.Add(transport.dbName, SqlDbType.VarChar, 100);
                sqlCommand.Parameters[transport.dbName].Value = transport.getWertDesParameters().Text.ToString();

              
         
                SqlDataReader reader = sqlCommand.ExecuteReader();
                while (reader.Read())
                {
                    foreach (Control controlread in this.Controls)
                    {
                      ParameterForm parameterFormRead = controlread as ParameterForm;
                       OrtskoordinateParameter ortskoordinateFormRead = controlread as OrtskoordinateParameter;

                        if (parameterFormRead != null)
                        {

                            if (parameterFormRead.dbName == reader.GetName(spalten_nr))
                            {
                                parameterFormRead.getWertDesParameters().Text = reader.GetValue(spalten_nr).ToString();
                                spalten_nr++;
                            }
                        }

                    }
                }

                reader.Close();

Es kommt immer die Fehlermeldung das die Stored Procedure noch einen Wert für transport benötigt. Aber ich übergebe ihm doch einen.

Kann mir jemand vielleicht erklären, was ich falsch mache?

LG
sailer

X
2.051 Beiträge seit 2004
vor 15 Jahren

na bist du denn sicher, dass transport.dbName richtigen namen hat? also in dem fall "trasnport"

bzw. vllt. liegts auch daran, dass die feldergrößen in der sp mit 50 eigegeben sind, deine parameter aber mit 100. dass es daran liegt, bezweifle ich aber..

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren

Hi,

sorry das war nur ein Rechtschreibfehler. Aber an dem lag es nicht und das Problem das es in der stored procedure varchar 50 ist und in c# varchar 100 liegt es auch nicht. das habe ich auch schon ausprobiert.

Hat sonst noch einer eine Idee an was es liegen könnte?

LG
sailer

L
770 Beiträge seit 2006
vor 15 Jahren

Stimmen die Namen 100%ig überein? (eventuell fehlt dir das @Zeichen)
Ansonsten is doch .Add veraltet oder? Warum verwendest du nicht AddWithValue?
lg Lion

lg Lion

X
2.051 Beiträge seit 2004
vor 15 Jahren

apropos 100%-Übereinstimmung. kleiner hinweis: "@" gehört nicht zu dem namen. prüfe das auch mal.

L
770 Beiträge seit 2006
vor 15 Jahren

kleiner hinweis: "@" gehört nicht zu dem namen. prüfe das auch mal.

hm, das wußte ich auch nicht, da ich es immer mit dem Zeichen verwende und es funktioniert? Aber wie gesagt, ich verwende AddWithValue, könnte es daran liegen?

lg

lg Lion

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren

Hi,

danke für die Antworten. Also ich habe die Stored Procedure in der DB ausgeführt und dort funktioniert sie wunderbar. Also kann meiner Meinung da kein Fehler liegen. Es habert einfach nur bei der übergabe von c#. Ich habe die Methode AddWithValue ausprobiert aber mein Fehler löst sich dadurch nicht.

Ich habe das ganze mal debuggt im sqlCommand hat er zwei Parameter. Aber sobald er an SqlDataReader reader = sqlCommand.ExecuteReader() kommt zeigt er mir den Fehler "Fehler bei der Funktion ... @transport wird erwartet aber nicht geliefert".

Habe ihr noch ideen woran es liegen könnte?

LG
sailer

F
10.010 Beiträge seit 2004
vor 15 Jahren

Was steht denn in transport.dbName?

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren

Hi,

in transport.dbName steht der Name der Datenbank. In diesem Fall Transportschluessel. Und in transport.getWertDesParameters().Text.ToString(); steht der Wert drin.

lg

X
2.051 Beiträge seit 2004
vor 15 Jahren

du fügst do den parameter an. und der heißt in der sp "transport" also muss der dbName "transport" heißen, nix anderes

sqlCommand.Parameters.Add("transport", SqlDbType.VarChar, 100);
                sqlCommand.Parameters[transport.dbName].Value = transport.getWertDesParameters().Text.ToString();
S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren

Hi,

es funktioniert 👍 Du hattest recht. Der zu übergebene Name muss genause heißen wie der dbName. Man war das eine schwere Geburt. Bis man darauf mal kommt. Aber vielen vielen lieben Dank euch allen.

LG
sailer 😁

X
2.051 Beiträge seit 2004
vor 15 Jahren

Hi,

es funktioniert 👍 Du hattest recht. Der zu übergebene Name muss genause heißen wie der dbName. Man war das eine schwere Geburt. Bis man darauf mal kommt. Aber vielen vielen lieben Dank euch allen.

LG
sailer 😄

hast du denn meine erste Post gar nicht gelesen? Stored Procedure - Übergabe von mehreren Parametern
😭

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 15 Jahren

Hi,

doch die hatte ich gelesen. Aber ich dachte nicht, dass ich den Namen den ich übergebe genauso heißen muss wie der Datenbankname. Ich dachte es wäre egal, wenn sie unterschiedlich heißen. Also irgendwie hatte ich das verpeilt.

Aber danke. 😁

Lg
sailer