Aufruf einer Stored Procudure in C#

mcpd

Grünschnabel
Hallo Leute

folgende Stored Procedure habe ich in MS SQL Server 2005 erstellt:

Code:
USE [BUILD_SKILL]
GO
/****** Objekt:  StoredProcedure [dbo].[stp_CommitPasswort]    Skriptdatum: 07/28/2009 14:08:52 ******/
ALTER PROCEDURE [dbo].[stp_CommitPasswort] 
	-- Parameter deklarieren
	@vorname_Nachname NVARCHAR(100),
	@pw NVARCHAR(MAX) OUTPUT
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT	@pw = Passwort
	FROM	dbo.Person
	WHERE	Vorname_Nachname = @vorname_Nachname
END

Der Aufruf der Procedure in SQL ist erfolgreich.

Leider funktioniert der Aufruf in C# nicht. Ich erhalte folgende Exception:

"String[1]: die Size-Eigenschaft hat den ungültigen Wert 0."

Folgende C#-Methode:

Code:
public void CommitEncryptPasswort(string vornameName)
    {
      // Ausnahmebehandlung
      try
      {
        // SQLCommand erstellen und STP zuweisen
        SqlCommand cmdStp = new SqlCommand("stp_CommitPasswort", con);

        // CommandType zuweisen
        cmdStp.CommandType = CommandType.StoredProcedure;

        // SQLParameter für STP erstellen
        SqlParameter parVorNachname = new SqlParameter("@vorname_Nachname", vornameName);
        SqlParameter parOutPasswort = new SqlParameter("@pw", SqlDbType.NVarChar);

        // SQLDbType für INPUT-Parameter zuweisen
        parVorNachname.SqlDbType = SqlDbType.NVarChar;

        // Parameter zuweisen und INPUT und OUTPUT festlegen
        cmdStp.Parameters.Add(parVorNachname).Direction = ParameterDirection.Input;
        cmdStp.Parameters.Add(parOutPasswort).Direction = ParameterDirection.Output;

        // STP ausführen
        cmdStp.ExecuteNonQuery();

        // Ermiitelten Wert zuweisen
        Passwort = cmdStp.Parameters["@pw"].Value.ToString();
      }
      catch (SqlException sqlError)
      {
        // Methode "CreateSqlException()" aufrufen
        CreateSqlException(sqlError);
      }
      finally
      {
        // Methode "Close_Connection()" aufrufen
        Close_Connection();
      }
    }

Ich hoffe, Ihr könnt mir schnell helfen. Danke.
 
Hi!!
Wahrscheinlich etwas spät aber dennoch:

Du solltest bei Stored Procedures (und allgemein bei Datenbank Variablen Typen) immer eine feste Size angeben. Das heisst in deinem Fall in der Datenbank Passwort nicht NVARCHAR(MAX) sondern z.B. NVARCHAR(200) angeben.
Denn in der C# Deklaration des SQLParameters gibt es , meines Wissens , keine NVARCHAR(MAX) Zuweisung. Du könntest höchsten in C# den SqlDbType NVARCHAR der Size den Wert 4000 zuweisen-- höchster NVARCHAR - WERT.

Der Fehler resultiert bei dir also auf der nicht gesetzten Size des SqlParamteres "@pw".
Versuchs mal auf die Weise: (Ich habe das Feld: Passwort in der Tabelle: Person den NVARCHAR Wert 100 zugewiesen)

Code:
        public const string constr = @"Database=Datenbank;Server=localhost;user id=dbuser;password=dbpwd";

public void CommitEncryptPasswort(string vornameName)
        {
            try
            {
                using (SqlConnection con = new SqlConnection(constr))
                {
                    con.Open();
                    // SQLCommand über das Connection Object erstellen
                    SqlCommand com = con.CreateCommand();

                    //SqlParameter erstellen und zuweisen
                    SqlParameter paramVornameName = new SqlParameter("@vorname_Nachname", vornameName);
                    SqlParameter paramPW = new SqlParameter("@pw", SqlDbType.NVarChar, 100);
                    
                    //SqlParameter zum SqlCommand hinzufügen
                    com.Parameters.Add(paramVornameName).Direction = ParameterDirection.Input;
                    com.Parameters.Add(paramPW).Direction = ParameterDirection.Output;

                    //SqlCommand Eigenschaften setzen
                    com.CommandType = CommandType.StoredProcedure;
                    com.CommandText = "stp_CommitPasswort";

                    //Ausführen
                    com.ExecuteNonQuery();

                    //SqlParamter abfrage
                    MessageBox.Show(paramPW.Value.ToString());
                }
            }
            catch (SqlException sqlError)
            {
                MessageBox.Show(sqlError.ToString());
            }
        }

Tipp:
Durch die Using Directiven brauchst du dich nicht um das Schließen der Connection zu kümmern. Das erfolgt dann automatisch. ;)
 
Zurück