Stored Procedure IN a OUT parametry   zodpovězená otázka

C#, ASP.NET WebForms, SQL, Databáze

Zdravím,

mám proceduru se vstupním i výstupním parametrem. Se vstupním parametrem problém nemám, ale výstupní mi nefunguje.

V kódu to je takhle:

public void ProcedureTest(int c_obj,String nazDod)
        {
            mDatabase.Connect();
            SqlCommand command = mDatabase.CreateCommand(PROCEDURA_TEST);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@c_obj", SqlDbType.Int, 0, "c_obj");
            command.Parameters.Add("@nazev_dod", SqlDbType.VarChar, 50, "nazev_dod");
            command.Parameters[0].Value = c_obj;
            command.Parameters[1].Direction = ParameterDirection.Output;
            command.ExecuteNonQuery();
            nazDod = command.Parameters[1].Value.ToString();
            mDatabase.Close();

        }

Spouštím přes tlačítko událost:

protected void Button1_Click(object sender, EventArgs e)
        {
            Database.ObjednavkaTable addSourceRecord = new Database.ObjednavkaTable();
            addSourceRecord.ProcedureTest(Convert.ToInt32(TextBox1.Text), LabelDodNaz.Text);
        
        }

Vypadá to ale tak, že do toho výstupu se nic nezapíše.

Samotná procedura je jednoduchá a v databázi funguje:

CREATE PROCEDURE [dbo].[test] 
	@c_obj int,@nazev_dod varchar(50) output
AS
BEGIN
SELECT @nazev_dod=dod.nazev_dod FROM Dodavatel dod,Objednavka obj WHERE 
dod.id_dod=obj.id_dod AND obj.c_obj=@c_obj 
END

Poradil by někdo ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ExecuteNonQuery() se pouziva prevazne na INSERT, UPDATE, DELETE..

Pokud se vam vraci jen jeden sloupec a jeden radek, tak misto ExecuteNonQuery() pouzijte ExecuteScalar()

string nazev = (string)cmd.ExecuteScalar();

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Výtupní parametr uložené procedury načítate správně. Akorát bych se na parametry určitě odkazoval přes jejich jména. Pořadí je nepřehledné a může se snadno změnit po přidání dalšího parametru. Problém je v předání parametru nazDod metodě ProcedureTest. Buď označte parametr jako výstupní, nebo raději parametr zrušte a změňte metodu, aby vracela string.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, já vím, že to může být nepřehledné a hlavně, když těch výstupních parametrů tam budu mít 10 :-D Ale to teď moc neřeším.

Tak chyba byla nakonec v tom, že jsem místo Stringu měl předávat Label, takhle už to funguje.

Ale mám ještě otázečku, jak dostat CommandArgument z ImageButtonu z eventu jako hodnotu do jiné třídy ?:)

edit: tak jsem to pořešil pomocí

Session["Redirect"] = e.CommandArgument;

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Session nepoužívejte, dříve či později si přivodíte různé problémy, nejčastěji v okamžiku, kdy jeden uživatel bude mít otevřenou tu samou stránku ve více záložkách v prohlížeči (ty typicky mívají sdílenou session).

Parametr si dejte do URL, pokud děláte redirect na jinou stránku (což doporučuji po každé operaci, která mění data, aby ji člověk klávesou F5 nemohl vyvolat znovu, je to tzv. post-redirect-get model), anebo ji nastavte do nějaké komponenty, pokud je to jen postback na tu samou stránku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback