Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Rückagbe einer Stored Procedure in C# abfangen
mipa_acc
myCSharp.de - Member



Dabei seit:
Beiträge: 320

Themenstarter:

Rückagbe einer Stored Procedure in C# abfangen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kubi
myCSharp.de - Member

Avatar #avatar-2774.gif


Dabei seit:
Beiträge: 384
Herkunft: Krefeld - NRW

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von kubi am .
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3358
Herkunft: Berlin

beantworten | zitieren | melden

Benutze doch beim DbCommand einen Output-Parameter, den Du nach Erledigung abfragst. Jürgen
private Nachricht | Beiträge des Benutzers
mipa_acc
myCSharp.de - Member



Dabei seit:
Beiträge: 320

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von mipa_acc am .
private Nachricht | Beiträge des Benutzers
mipa_acc
myCSharp.de - Member



Dabei seit:
Beiträge: 320

Themenstarter:

beantworten | zitieren | melden

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;
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
mirkom76
myCSharp.de - Member



Dabei seit:
Beiträge: 131
Herkunft: Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers