tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
2041
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mcpd mcpd ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    16
    Hallo Leute

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    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.
     

  2. #2
    freakbrother freakbrother ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Ort
    Ostmanien
    Beiträge
    33
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
            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, [COLOR="MediumTurquoise"]100[/COLOR]);
                        
                        //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.
     

Ähnliche Themen

  1. Rückgabetabellen einer Stored Procedure zusammenfassen
    Von martinpriebe im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 09.07.08, 10:35
  2. Fehler beim Aufruf einer Stored Procedure per VBS
    Von oliander im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 23.05.08, 15:22
  3. ETL - Zugriff auf remote Datenbank in einer stored procedure
    Von Romanticus im Forum Relationale Datenbanksysteme
    Antworten: 7
    Letzter Beitrag: 11.12.07, 12:55
  4. Wie kann in einer Stored Procedure von ein int auf date konvertiert werden?
    Von Aleyna23 im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 15.01.07, 17:12
  5. Antworten: 3
    Letzter Beitrag: 15.06.05, 10:37