Laden...

Rückagbe einer Stored Procedure in C# abfangen

Erstellt von mipa_acc vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.981 Views
M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 15 Jahren
Rückagbe einer Stored Procedure in C# abfangen

Hallo,

ich nutzte Visual Studio 2008. Ich habe eine sehr einfache stored procedure:
ALTER procedure [dbo].[stInsertProduct] (
@ProductGroupId as nvarchar(100),
@FriendlyName as nvarchar(100),
@ProductDescription as nvarchar(100)
)
as
begin

        insert into Product (  
              fk_ProductGroupId,  
              FriendlyName,  
              ProductDescription  
        )  
        values (  
			  @ProductGroupId,  
              @FriendlyName,  
              @ProductDescription  
        )  
          
        return scope_identity()  

  end  

Über folgenden C# Code kann ich diese auch ausführen, allerdings kann ich die Id nicht speichern weil ich irgendwie gar nichts zurück bekomme. Von der Datenbank kommt aber 100% die Id zurück, weil ich es direkt im Studio getestet habe. Es liegt also irgendwie daran, dass ich die SP falsch aufrufe denke ich... hier der code:


            SqlConnection Con = new SqlConnection(@"Data Source=XXX;Initial Catalog=XXXX;Integrated Security=SSPI");

            Con.Open();

            // SqlCommand vorbereiten 
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = spName;
            // Parameter-Auflistung füllen           
            cmd.Parameters.AddRange(parameters);

            // SqlCommand ausführen 
            SqlDataReader dr = cmd.ExecuteReader();

            DataSet ds = new DataSet();

            DataTable dt = new DataTable("ReturnValues");

            while (dr.Read())
                dt.Rows.Add(dr[0]);
            dr.Close();
            Con.Close(); 

            return new DataSet();

Habt ihr eine Ahnung warum das so ist?

Vielen Dank im Vorraus

MfG

365 Beiträge seit 2007
vor 15 Jahren

Hallo mipa_acc,

schon mal statt:


// SqlCommand ausführen
SqlDataReader dr = cmd.ExecuteReader();


int neueId = (Int32)cmd.ExecuteScalar();

versucht?!

Greetz da kubi.

Edit:


DataSet ds = new DataSet();
DataTable dt = new DataTable("ReturnValues");

while (dr.Read())
{
    dt.Rows.Add(dr[0]);
}
dr.Close();
Con.Close();

return new DataSet();

Zum Fehler:
Du initialisierst ein neues DataSet, danach initialisierst du eine neue DataTable.
Wofür das DataSet wenn du die Tabelle nicht zu deren Auflistung hinzufügst?
Du gibst nur ein leeres DataSet zurück, so wie es im Code aussieht.

J
3.331 Beiträge seit 2006
vor 15 Jahren

Benutze doch beim DbCommand einen Output-Parameter, den Du nach Erledigung abfragst. Jürgen

M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 15 Jahren

Hallo,

habe nun alle Vorschläge probiert...


object id = cmd.ExecuteScalar();

ergibt null

in die while schleife geht er mir gleich gar nicht rein. Das hießt ja für mich, dass es nichts zu lesen gibt. Versteh ich einfach nicht 😦

Kann es sein, dass ich bei meiner StoredProcedure noch irgendetwas hinzufügen muss?

Noch irgendwelche andere Ideen? Bin ratlos

M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 15 Jahren

Hi,

habs nun so gelöst, dass ich meine SP umgebaut hab. Sie sieht nun so aus:

exec ('
create procedure stInsertProduct (
@ProductGroupId as nvarchar(100),
@FriendlyName as nvarchar(100),
@ProductDescription as nvarchar(100),
@NewId as int output
)
as
begin

        insert into Product (  
              fk_ProductGroupId,  
              FriendlyName,  
              ProductDescription                    
        )  
        values (  
			  @ProductGroupId,  
              @FriendlyName,  
              @ProductDescription  
        )  
          
        SET @NewId = scope_identity()  
        return   

  end  

')

Und mein Code so:


            SqlConnection Con = new SqlConnection(@"Data Source=GAME-PC\LOCAL;Initial Catalog=Kelmendi;Integrated Security=SSPI");

            Con.Open();

            // SqlCommand vorbereiten 
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = spName;

                        
            // Parameter-Auflistung füllen           
            cmd.Parameters.AddRange(parameters);

            //Für die Rückgabe der ID
            cmd.Parameters.Add(new SqlParameter("@NewId", SqlDbType.Int, 4, ParameterDirection.Output, false, 0, 50, "NewId", DataRowVersion.Default, null));
            
            // SqlCommand ausführen 
            SqlDataReader dr = cmd.ExecuteReader();

            Con.Close(); 
            
            return (int)cmd.Parameters["@NewId"].Value;

L
770 Beiträge seit 2006
vor 15 Jahren

Eventuell könntest du dir auch noch die Möglichkeiten anschauen, wie man eine SQL Abfrage bzw. eine SP ausführen kann, im speziellen denke ich an die ExecuteNonQuery Möglichkeit.

Lion1984

lg Lion

3.511 Beiträge seit 2005
vor 15 Jahren

Hast du die SP nur da, um an die ID des letzten Eintrages zu kommen? Wenn du SQL 2005 oder höher verwendest, gibt es da bessere Möglichkeiten (OUTPUT).

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
110 Beiträge seit 2007
vor 15 Jahren

So wie cih das sehe, willst Du nur die ID des eingefügten Eintrages auslesen.

Das geht wesentlich eleganter. Du musst in der gleichen Transaction

SELECT @@Identity

ausführen.Der Returnwert ist dann die ID innerhalb der Transaction die in der Datenbank eingefügt wurde.

Gruss

Mirko

Mappen statt hacken mit Invist , dem .NET O/R Mapper - Code Generator

3.511 Beiträge seit 2005
vor 15 Jahren

Einfach ein INSERT OUTPUT Statement ab SQL 2005. Dann brauch man auch kein "gefrickel" mehr mit @@IDENTITY

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)