Vstupní/výstupní parametry SQL procedury   zodpovězená otázka

VB.NET, ADO.NET, WinForms, Databáze

Dobrý den, už se zde podobná věc řešila (http://www.vbnet.cz/forum-tema--1140-uvo... ) ale bohužel se mi to nepodařilo podle tohoto návodu rozchodit. Udělal jsem si cvičnou aplikaci která načte seznam uživatelů z SQL serveru a zobrazí je v datagridViewu. Chci využít procedury uložené na SQL serveru a ta požaduje vstupní parametr jméno. To se mi podařilo rozchodit pouze s executereader ale já bych chtěl využít data adapter (lépe se mi s daty pracuje a lépe se mi jimi plní datagridView).

K načtení používám tento kód :

    Sub naplnTabulku()

        Dim connectionString As String = "SERVER=serverXY;DATABASE=testovaci_db;UID=dbUser;PWD=user123"
        Dim spojeni As New SqlClient.SqlConnection(connectionString)
        Dim dt As Data.DataTable = New Data.DataTable
        Dim jmeno As String



        jmeno = InputBox("jmeno")
        Dim da As New SqlClient.SqlDataAdapter("procedura1 @jmeno", spojeni)





        da.Fill(dt)
        frmAplikace.DgvOdlozenePozadavky.DataSource = dt


    End Sub

Můžete mi prosím poradit jak správně přiřadit do tohoto dotazu vstupní parametr? A také by mě zajímalo jak zpracovat parametr výstupní (například kdyby tato sql procedura měla výstupní parametr @pocetLoginu která by mi vrátila kolikrát se tento zadaný uživatel zalogoval).

A ještě uplně poslední věc: Pokud takto načtu například seznam uživatelů do datatable (id uživatele a jméno uživatele), jak jimi lze naplnit combobox? Doteď jsem to řešil tak, že jsem si to naklikal v průvodci. To se mi ale vůbec nelíbí, protože nad tím nemám žádnou kontrolu.

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

Dobrý den,

zkuste následující kód:

        Dim connectionString As String = "SERVER=serverXY;DATABASE=testovaci_db;UID=dbUser;PWD=user123"
        Dim spojeni As New SqlClient.SqlConnection(connectionString)
        Dim dt As Data.DataTable
        Dim jmeno As String

        jmeno = InputBox("jmeno")

        Dim cmd As New SqlClient.SqlCommand
        With cmd
            .Connection = spojeni
            .CommandType = CommandType.StoredProcedure
            .CommandText = "procedura1"
            .Parameters.Add("@jmeno", SqlDbType.Char)
            .Parameters("@jmeno").Direction = ParameterDirection.Input
            .Parameters("@jmeno").Value = jmeno
        End With

        Dim da As New SqlClient.SqlDataAdapter
        da.SelectCommand = cmd
        Dim ds As New DataSet
        da.Fill(ds, "Jmena")
        If Not ds.Tables("Jmena") Is Nothing Then
            dt = ds.Tables("Jmena")
        End If

Vstupní parametr přidáte pomocí kolekce Parameters objektu SqlCommand. Vlastnost Direction ve výše uvedeném příkladě není nutné nastavovat. Defaultně se totiž předpokládá, že pracujeme se vstupními parametry.

Práce s výstupním parametrem by pak vypadala asi takto. Předpokládejme, že chcete vrátit jen jeden údaj. Např. počet jmen, které vyhovují nějaké podmínce. Dále předpokládejme, že uložená procedura má takto označený výstupní parametr @Pocet.

Pak postačí využít metodu ExecuteScalar objektu SqlCommand např. podle následujícího kódu :

...
        Dim nPocet As Integer = 0
        Dim cmd As New SqlClient.SqlCommand
        With cmd
            .Connection = spojeni
            .CommandType = CommandType.StoredProcedure
            .CommandText = "procedura2"
            .Parameters.Add("@Pocet", SqlDbType.Char)
            .Parameters("@Pocet").Direction = ParameterDirection.Output
            nPocet = CType(.ExecuteScalar(), Integer)
        End With

V proměnné nPocet pak máte uložen výsledek.

Pokud jde pouze o naplnění ComboBoxu, mohlo by to fungovat následovně:

Me.ComboBox.DataSource = dt
Me.ComboBox.DisplayMember = "JMENO"

Kde dt je objekt DataTable naplněný údaji z databáze se jmény.

Objekt DataTable se přiřadí vlastnosti DataSource ComboBoxu a vlastnost DisplayMember nastavíte na pole tabulky, které chcete v ComboBoxu zobrazit. V našem případě tedy pole JMENO objektu DataTable (dt.Columns("JMENO")

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

Velice děkuji, vše funguje jak má:) Jen bych se ještě zeptal jak přiřadit k položkám v comboboxu id položky, kterou mají v databázi. Jde o to že uživatel například vybere nějákou položku, potvrdí a v databázi se provede update. V databázi jsou vytvořené relace (mám vždy vytvoření "číselník"), takže potřebuji aby se do db uložilo pouze ID vybrané položky:)

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

Pokud chcete číst vybranou hodnotu z ComboBoxu, pak použijte následující kód :

With Me.ComboBox1
     .DataSource = dt
     .DisplayMember = "jmeno"
     .ValueMember = "id"
End With

Pole ID přiřadíte do vlastnosti ValueMember. Pro čtení hodnoty pak použijete např. následující kód :

 Dim nID As Integer = Me.ComboBox1.SelectedValue

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

Tak teď už vím vše potřebné:) Mnohokrát děkuji:)Já pořád laboroval s IndexOf a pak mi došlo že na to jdu špatně:)

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