|
[ 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 ] @
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 :)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|