Gå til innhold

C#: Hente ut en int verdi fra en stored procedure?


Anbefalte innlegg

Hei, det kan hende dette er en veldig enkel sak, men hver gang jeg googler eksempler på stored procedures så er dette med parameter og mye annet mer avansert.

 

Og jeg har enda ikke funnet noen måte å få ut resultatet fra stored proceduren på heller.

 

Det jeg har er en database med utførte "jobber" for en venn av meg som driver enkeltmannsforetak og de jobbene er lagret med pris.

 

Jeg har laget en stored procedure for å hente ut sum(Pris) og denne fungerer utmerket og returnerer omsetningen.

 

Men når jeg skal kjøre denne stored procedure i c# kommer jeg ikke så langt at jeg får ut "return value" fra den.

 

       public int getOmsetning()
       {
           // tilkoblingen til databasen fungerer 
           // omsetning er navnet på stored procedure i Microsoft SQL Server Management

           SqlCommand command = new SqlCommand("omsetning", myConnection);
           command.CommandType = CommandType.StoredProcedure;

           SqlDataReader omsetning;
           myConnection.Open();
           omsetning = command.ExecuteReader();


           return omsetning;


       }

 

return virker naturlig nok ikke nå siden den er satt til int og omsetning er akkurat nå object, men det jeg lurer på er hvordan får jeg ut int eller evt string-verdien av stored procedure?

 

har prøvd i over en time nå med forskjellige tutorials og eksempel på nettet, men kommer ingen vei. Håper det er noen som er gode i det her som kan hjelpe.

Lenke til kommentar
Videoannonse
Annonse

Dersom den bare returnerer en rad med en kolonne kan du bruke sqlcommand.executescalar()

 

Edit: kan jo kopiere ut eksempelet

static public int AddProductCategory(string newName, string connString)
{
   Int32 newProdID = 0;
   string sql =
       "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
       + "SELECT CAST(scope_identity() AS int)";
   using (SqlConnection conn = new SqlConnection(connString))
   {
       SqlCommand cmd = new SqlCommand(sql, conn);
       cmd.Parameters.Add("@Name", SqlDbType.VarChar);
       cmd.Parameters["@name"].Value = newName;
       try
       {
           conn.Open();
           newProdID = (Int32)cmd.ExecuteScalar();
       }
       catch (Exception ex)
       {
           Console.WriteLine(ex.Message);
       }
   }
   return (int)newProdID;
}

Endret av Tommy
Lenke til kommentar

Flere måter å gjøre dette på, men det enkleste for deg i dette tilfellet kan være å bruke ExecuteScalar(), istedet for ExecuteReader(), siden du bare skal ha en int tilbake.

 

Et enkelt eksempel:

 

SqlConnection sqlConnection1 = new SqlConnection("Your Connection String");

SqlCommand cmd = new SqlCommand();

Int32 returnValue;

 

cmd.CommandText = "StoredProcedureName";

cmd.CommandType = CommandType. StoredProcedure;

cmd.Connection = sqlConnection1;

 

sqlConnection1.Open();

 

returnValue = (Int32) cmd.ExecuteScalar();

 

sqlConnection1.Close();

Lenke til kommentar

Flere måter å gjøre dette på, men det enkleste for deg i dette tilfellet kan være å bruke ExecuteScalar(), istedet for ExecuteReader(), siden du bare skal ha en int tilbake.

 

Et enkelt eksempel:

SqlConnection sqlConnection1 = new SqlConnection("Your Connection String");
SqlCommand cmd = new SqlCommand();
Int32 returnValue;

cmd.CommandText = "StoredProcedureName";
cmd.CommandType = CommandType. StoredProcedure;
cmd.Connection = sqlConnection1;

sqlConnection1.Open();

returnValue = (Int32) cmd.ExecuteScalar();

sqlConnection1.Close();

 

Hmm prøvde denne, men får null tilbake fra executescalar, kan virke som at den ikke finner stored proceduren? når jeg executer stored proceduren manuellt i visual studio får jeg riktig return value (omsetningen). Men når jeg prøver å kjøre den gjennom kode får jeg null :\

 

Den første virket litt mer avansert enn det jeg er ute etter, men jeg kan ta feil. Kan hende jeg var dårlig å forklare i starten, men det eneste stored proceduren gjør er å summere et felt som inneholder pris på hver jobb utført. og returnerer det tallet som blir omsetningen.

 

Her er koden for stored proceduren som fungerer, og koden jeg fikk nå med eksempelet ditt.

ALTER PROCEDURE omsetning

AS

Declare @omsetning INT

select @omsetning = (select SUM(Pris) from Jobb)

return @omsetning

 

       public int getOmsetning()
       {

           SqlCommand cmd = new SqlCommand();
           Int32 returnValue = 0;

           cmd.CommandText = "omsetning";
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.Connection = myConnection;

           myConnection.Open();
           returnValue = (Int32)cmd.ExecuteScalar();

           myConnection.Close();

           return returnValue;


       }

 

har koblet til databasen også, men tok ikke med connection stringen, virker på å registrere og liste opp jobber osv, som nevnt tidligere, så det er ikke noe feil med den heller.

Endret av SkyFish
Lenke til kommentar

Hei igjen, ordnet det med en litt "spansk" måte sikkert, men jeg fikk ikke til stored proceduren, så jeg gjorde det på denne måten isteden:

 

public Decimal getOmsetning()
       {
           Decimal omsetning = 0;
           string temp = "";

           SqlDataAdapter myData = new SqlDataAdapter("SELECT * FROM Jobbrapport", myConnection);
           myData.Fill(hovedoppgaveDataSet, "Jobb");
           foreach (DataRow Jobb in hovedoppgaveDataSet.Tables["Jobb"].Rows)
           {

               // Sums the pris field together for each job in the database.
               temp = Jobb["Pris"].ToString() + "\r\n";
               omsetning = omsetning + Decimal.Parse(temp);

           }
           return omsetning;
       }

 

Dette er samme måten jeg lister opp alle feltene når jeg skriver innholdet til en textbox, jeg bare fjernet de andre feltene og tok med bare pris feltet og plusset de sammen.

 

Takk for forslagene iallefall selv om jeg ikke helt fikk det til med den måten, så om det er noen som vet hva jeg har gjort feil tar jeg gjerne imot tips :)

Lenke til kommentar
  • 4 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...