[ borcha @ 10.07.2007. 22:49 ] @
Interesuje me kako da iskristim DataSet u cilju prikazivanja jednog reda u Bazi (SQL Server) a ne citave tabele. Evo koda sa kojim pokusavam to i da ucinim!!

Code:

Dim con As New SqlClient.SqlConnection(strCon)
        con.Open()
        Try

        '
            Dim da As SqlClient.SqlDataAdapter
            Dim ds As New DataSet
            Dim cmd As New SqlClient.SqlCommand
            Dim strIdUce As String

            strIdUce = "SELECT ID_Ucenik " & _
            "FROM tPodUce" & _
            " WHERE ID_Skola=" & frmDialog.lblIDSkole.Text & " AND ID_Ucenik=" & frmUnoUce.cboSifUce.Text



            da = New SqlClient.SqlDataAdapter(strIdUce, con)
            da.Fill(ds, "tPodUce")




            frmUnoUce.txtIme.Text = ds.Tables("tPodUce").rows("Ime").ToString
           

            da.Dispose()
            ds.Dispose()

            con.Close()
        Catch ex As Exception
            MessageBox.Show("Greska!")
        End Try


Znaci zelim da izdvojim samo jedan red na osnovu zadatih kriterijuma!
Nadam se da ce biti jasno po kodu sta zelim da kazem!

Gde gresim?
Hvala


[Ovu poruku je menjao borcha dana 11.07.2007. u 00:35 GMT+1]
[ Shevchenko @ 11.07.2007. 07:15 ] @
Pa po mom misljenju, ako zelis samo jedan red , bolje resenje je da umesto DataSeta koristis DataReader. DataAdapter ti je nepotreban.
Kod bi izgledao ovako nekako:
Code:

Dim con As New SqlClient.SqlConnection(strCon)
        con.Open()
        Try

        '
            Dim reader As New SqlClient.SqlDataReader
            Dim cmd As New SqlClient.SqlCommand
            Dim strIdUce As String

            strIdUce = "SELECT ID_Ucenik " & _
            "FROM tPodUce" & _
            " WHERE ID_Skola=" & frmDialog.lblIDSkole.Text & " AND ID_Ucenik=" & frmUnoUce.cboSifUce.Text

            reader = strIdUce.ExecuteReader
            reader.Read()
            frmUnoUce.txtIme.Text = reader["ime colone"].Value.ToString()
            reader.Close()

            con.Close()
        Catch ex As Exception
            MessageBox.Show("Greska!")
        End Try



Proveri kod, posto sam ga pisao iz glave. A i ja sam vise C# programer, pa je moguce da sam negde pogresi sintaksu, ali ideja je bitna ;)

[Ovu poruku je menjao Shevchenko dana 12.07.2007. u 03:43 GMT+1]
[ dusty @ 11.07.2007. 08:03 ] @
Na prvi pogled ovo ne valja:
Code:
ds.Tables("tPodUce").rows("Ime").ToString

Moras da das indeks reda, pa ime kolone:
Code:
ds.Tables("tPodUce").rows(0)("Ime").ToString

[ Function @ 11.07.2007. 09:36 ] @
Ako baš želiš uzeti samo Id, možeš onda koristiti SqlCommand.ExecuteScalar(), vraća ti prvu vrijednost u zadanom upitu, a pošto tebi i treba samo jedna, nećeš imati problema.

C# code::
int id = int.Parse(command.ExecuteScalar().ToString());
[ borcha @ 11.07.2007. 11:47 ] @
Hvala dusty!!
[ borcha @ 11.07.2007. 11:57 ] @
Prijavljuje mi gresku na (kad kompajlira kod)

[cod] reader = strIdUce.ExecuteNonQuery()
[/cod]

a da ne ide mozda:

[cod] reader = strIdUce.ExecuteScalar
[/cod]

U knjizi Alison Blater kaze da je ova druga za izdvajanje pojedinacnog zapisa??
[ dusty @ 11.07.2007. 12:10 ] @
ExecuteNonQuery izvrsava komandu koja ne vraca podatke, vec broj redova koji su procesirani. Npr. za update, insert, delete, poziv neke storke koja vraca vrednosti kroz parametre i sl. Znaci ne-upite. Koleza Shevchenko je garant mislio na ExecuteReader.

ExecuteScalar je prava stvar ako upit treba da ti vrati samo jednu-jedinu vrednost (npr. upit slican select ime from Imena where imenaID = 5), tj. metoda izvrsava komandu i vraca vrednost prvog reda prve kolone, ukoliko rezultat upita ima vise redova i kolona.
[ borcha @ 11.07.2007. 12:27 ] @
Da ok, shevchenko radi sa C# tako da nije problem. Execute Reader je u pitanju ExecuteNonQuery znam da vraca broj rezultata tj. poslednjeg unetog!!

Pokusavam i sa SqlCommand.ExecuteScalar ne ide, pokazuje neku gresku!
[ dusty @ 11.07.2007. 12:51 ] @
Citat:
poslednjeg unetog


Ne, samo broj procesiranih redova. Zasto to napominjem, zamisli situaciju da si insertovao 10 redova podataka. Znaci poslednji red ima id 10. Obrises poslednja dva reda. Insertujes jos jedan red, poslednji id je 11, a ExecuteNonQuery koji je izvrsio taj insert ce vratiti 1. Ako izvrsis select * from nesto preko ExecuteNonQuery dobices 9, jer je toliko redova procesirano.

Citat:
Pokusavam i sa SqlCommand.ExecuteScalar ne ide, pokazuje neku gresku!


Daj da vidimo upit i gresku koju ti izbacuje.

Evo jedan primer, mozda pomogne:
Code:

dim cmd as new SqlCommand("select * from tabela order by tabelinID desc", con) 'con je otvorena konekcija na bazu
dim id as int
id = CInt(cmd.ExecuteScalar())


Ovim kodom ce ti vratiti poslednji id u tabeli (mada postoji TSQL komanda koja vraca poslednji identifier). Nisam VB-ovac pa sigurno ima neka sintaksna greskica, but you'll get the picture
[ borcha @ 11.07.2007. 13:04 ] @
Evo koda, ali nije sa SQlCommand varijantom nego je Reader tu. Sve jedno imam oped gresku:

Code:
 Dim dr As SqlClient.SqlDataReader
        Dim cmd As SqlClient.SqlCommand
        Dim strIdUce As String

        strIdUce = "SELECT ID_Ucenik " & _
        "FROM tPodUce" & _
        " WHERE ID_Skola=" & frmDialog.lblIDSkole.Text & " AND ID_Ucenik=" & frmUnoUce.cboSifUce.Text

        cmd = New SqlClient.SqlCommand(strIdUce, con)
        dr = cmd.ExecuteReader
        dr.Read()
        frmUnoUce.txtIme.Text = dr("Ime")
        frmUnoUce.txtPrezime.Text = dr("Prezime")



evo i prilog slika!

Pozdrav
[ dusty @ 11.07.2007. 13:26 ] @
Pretpostavljam da konekcija (con) ka bazi postoji, samo da je nisi ovde napisao ?
Prvo sto mi bode oci je dr("Ime") i dr("Prezime"), a u upitu si stavio samo SELECT ID_Ucenik , tako da te kolone ne postoje u rezultatu upita.

Ostalo mi deluje uglavnom ok .... uglavnom
[ borcha @ 11.07.2007. 13:32 ] @
Koja sam ja budala ee! Stvarno ih nema u upitu.....Hvala ti!!!
[ borcha @ 11.07.2007. 13:33 ] @
Sad je bolje, jel!?

Sub PrikazPojedinacnoUcenikaClikomNacboSifra_frmUnoUce()
Dim con As New SqlClient.SqlConnection(strCon)
con.Open()


'
Dim dr As SqlClient.SqlDataReader
Dim cmd As SqlClient.SqlCommand
Dim strIdUce As String

strIdUce = "SELECT ID_Ucenik,Ime,Prezime " & _
"FROM tPodUce" & _
" WHERE ID_Skola=" & frmDialog.lblIDSkole.Text & " AND ID_Ucenik=" & frmUnoUce.cboSifUce.Text

cmd = New SqlClient.SqlCommand(strIdUce, con)
dr = cmd.ExecuteReader
dr.Read()
frmUnoUce.txtIme.Text = dr("Ime").ToString
frmUnoUce.txtPrezime.Text = dr("Prezime").ToString



con.Close()


Da,da sad radiii!
[ mmix @ 11.07.2007. 14:06 ] @
Samo jos jedan komentar, umesto

SELECT ID_Ucenik,Ime,Prezime

stavi

SELECT TOP 1 ID_Ucenik,Ime,Prezime


manji pritisak na bazu, ovaj query ce vratiti samo jedan red, koliko tebi i treba. Bez obzira sto ti citas samo jedan red, bez TOP 1 upit ce tvojoj aplikaciji vratiti sve redove.
[ borcha @ 11.07.2007. 14:13 ] @
Ok, razumem a sta kazes na:


Code:
SELECT * 

SELECT ID_Ucenik,Ime,Prezime 


To isto pravi problem (opterecuje)!!?

[ dusty @ 11.07.2007. 14:25 ] @
Nije bitan broj kolona (sem ako nisi napravio cirka 1024 ), koliko je bitan broj redova koje ti vraca. Posto koristis samo prvi red, ostali su visak, je'l. Sto ce reci da ce taj visak da nepotrebno optereti izvrsavanje upita, a zatim i prenos do tvoje aplikacije i na kraju resurse koje tvoja aplikacija alocira da bi smestila te podatke, od kojih maltene 99% odbacujes.

Prakticno, videces da se takav upit sporije izvrsava nego kada mu das top i upit vrati samo jedan red. Mozda ti to sada ne izgleda sporo, ali cekaj da baza naraste
[ Shevchenko @ 12.07.2007. 02:44 ] @
Citat:
dusty: Koleza Shevchenko je garant mislio na ExecuteReader.

Da mislio sam na ExecuteReader :) Ali tako to biva kada pisem kod na brzinu u 8 sati ujutru ;) Ispravio sam :)