Avatar billede macpain Nybegynder
10. juni 2004 - 14:26 Der er 18 kommentarer og
1 løsning

Information fra stored procedure

Hvis jeg skal hente data ud fra en stored procedure, hvorledes gøres dette.

Jeg har sat min stored procedure op til at kunne returnere en outout værdi og dette er testet i query analyzeren og det virker.

Men hvordan får jeg det til at virke med C#. Jeg er ikke interesseret i rækker eller koloner. Kun min return output værdi, hvis man skal hente det ud fra en række så fred være med det!

Dette er hvad jeg bruger nu, men det virker ikke:

OdbcDataReader myReader = trsOdbcCommand.ExecuteReader(CommandBehavior.SingleRow);
Console.WriteLine("{0}, myReader.GetName(0)");
Avatar billede arne_v Ekspert
12. juni 2004 - 10:22 #2
Super simpelt eksempel:

CREATE PROCEDURE TEST_OUT
@outarg INTEGER OUTPUT
AS
SELECT @outarg = 123
GO

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2;Integrated Security=SSPI;database=Test");
        con.Open();
        SqlCommand cmd = new SqlCommand("TEST_OUT", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter prm = new SqlParameter("@outarg", SqlDbType.Int, 0, "outarg");
        prm.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(prm);
        cmd.ExecuteNonQuery();
        Console.WriteLine((int)cmd.Parameters["@outarg"].Value);
        con.Close();
    }
}
Avatar billede macpain Nybegynder
14. juni 2004 - 08:50 #3
Det jeg mangler er retur værdien fra min stored procedure altså hvore jeg skriver:
RETURN (4) eksempelvis
er har fundet ud af hvorledes jeg henter en output værdi fra min medsendte dataholder eller hvad den hedder(ParameterDirection.Output)
ellers mange tak!
Det andet må også være nemt, hvis man "bare gør det rigtigt" jeg har læst at det gøres på næsten sammen måde men jeg kan bare ikke få det til at virke!!! :-(
Avatar billede arne_v Ekspert
14. juni 2004 - 09:27 #4
ParameterDirection.ReturnValue
Avatar billede macpain Nybegynder
14. juni 2004 - 09:40 #5
Jeps, men jeg kan ikke få det til at virke, og jeg forstår det ikke! Jeg er ved at blive tosset :-)
Jeg skriver i nuværende stund               
OdbcParameter Return = trsOdbcCommand.Parameters.Add("@Return",OdbcType.Int);
Return.Direction = ParameterDirection.ReturnValue;//Sets direction
int locReturnValue = trsOdbcCommand.ExecuteNonQuery();
giver -1 og
locReturnValue = (int)Return.Value;
fejler
hvad gør jeg forkert, jeg modtager -1 og null og jeg skriver i min stored procedure RETURN (0) eller RETURN (1)
Avatar billede arne_v Ekspert
14. juni 2004 - 10:27 #6
Prøv:

(int)cmd.Parameters["@Return"].Value
Avatar billede macpain Nybegynder
14. juni 2004 - 12:57 #7
(int)trsOdbcCommand.Parameters["@Return"].Value;

giver også fejl, returnere null pointer, altså "" string
Avatar billede arne_v Ekspert
14. juni 2004 - 22:34 #8
Følgende virker hos mig:

CREATE PROCEDURE TEST_OUT_RET
@outarg INTEGER OUTPUT
AS
SELECT @outarg = 123
RETURN 456
GO

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2;Integrated Security=SSPI;database=Test");
        con.Open();
        SqlCommand cmd = new SqlCommand("TEST_OUT_RET", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter prm = new SqlParameter("@outarg", SqlDbType.Int, 0, "outarg");
        prm.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(prm);
        SqlParameter ret = new SqlParameter("@retval", SqlDbType.Int);
        ret.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(ret);
        cmd.ExecuteNonQuery();
        Console.WriteLine((int)cmd.Parameters["@outarg"].Value);
        Console.WriteLine((int)cmd.Parameters["@retval"].Value);
        con.Close();
    }
}
Avatar billede macpain Nybegynder
25. juni 2004 - 16:28 #9
Takker for din tid, du skal selvfølgelig have pointene for din effort! Beklager tiden, men løste problem på andet vis.
Ved du evt. om det er muligt at retunere en output værdi hvis man bruger: cmd.ExecuteReader(); sammen med sit recordset?
Avatar billede macpain Nybegynder
25. juni 2004 - 16:32 #10
Selvom jeg acceptere dit svar sker det intet, må prøve senere
Avatar billede arne_v Ekspert
25. juni 2004 - 16:32 #11
Jeg tror det.

Jeg kan prøve det i aften.

Men jeg at man kan i Java, så monstro ike også man kan i .NET !
Avatar billede macpain Nybegynder
25. juni 2004 - 16:33 #12
Det skulle nok være muligt, takker for hjælpen på forhånd!
Avatar billede arne_v Ekspert
25. juni 2004 - 21:55 #13
CREATE PROCEDURE TEST_OUTRSRET
@outarg INTEGER OUTPUT
AS
SELECT @outarg = 123
SELECT * FROM T1
RETURN 456
GO


using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2;Integrated Security=SSPI;database=Test");
        con.Open();
        SqlCommand cmd = new SqlCommand("TEST_OUTRSRET", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter prm = new SqlParameter("@outarg", SqlDbType.Int, 0, "outarg");
        prm.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(prm);
        SqlParameter ret = new SqlParameter("@retval", SqlDbType.Int);
        ret.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(ret);
        SqlDataReader rdr = cmd.ExecuteReader();
        while(rdr.Read())
        {
            Console.WriteLine(rdr[0] + " " + rdr[1]);
        }
        rdr.Close();
        Console.WriteLine((int)cmd.Parameters["@outarg"].Value);
        Console.WriteLine((int)cmd.Parameters["@retval"].Value);
        con.Close();
    }
}
Avatar billede arne_v Ekspert
25. juni 2004 - 21:56 #14
NB: Det er vigtigt at kalde rdr.Close inden du forsøger at tilgå Parameters !
Avatar billede macpain Nybegynder
26. juni 2004 - 09:32 #15
Hrmm det er mærkeligt.... Tilgår det på næsten samme måde, dog gennem en odbc forbindelse. Men det burde jo ikke gøre nogen forskel.
Men hvis du vil eller har lyst kan du jo prøve om det gør en forkel hos dig, kan dog ikke se hvorfor, jeg må bare klø på.
Avatar billede arne_v Ekspert
26. juni 2004 - 22:20 #16
Jeg kan heller ikke få det til at virke med Odbc.

Men hvorfor bruger du ikke bare SqlClient ?

Stored procedures er alligevel ikke portable !
Avatar billede macpain Nybegynder
27. juni 2004 - 19:01 #17
Det er simpelhen et spørgsmål om det der er valgt som måden projektet skal køre på, de er jo mener effektive end alm. sql queryes, men det kan være jeg kan smutte uden om, da de udtyk jeg skal bruge ikke er så tidskrævende!
Men hvad mener du med portable
Avatar billede arne_v Ekspert
27. juni 2004 - 19:20 #18
Stored procedures er mere effektiv end almindelige queries.

Mit spørgsmål var hvorfor I brugte Odbc i.s.f. SqlClient (System.Data.Odbc versus
System.Data.SqlClient).

Fordelen ved Odbc er at den kan bruges med alle databasser. Men stored
procedures er alligevel database specifikke, så derfor syntes jeg måske
lige så godt at I kunne bruge SqlClient.
Avatar billede macpain Nybegynder
27. juni 2004 - 22:44 #19
JAhh, når skidtet ikke virker så er der nok ikke nogen vej uden om!
Så sql it is...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester