Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Presbiopia - la 43 ani ?

Termen transcriere autovehicul

Cazare Timisoara pe 4-5 zile

Primele zile ale internetului per...
 Ditra 25

Casti USB-C ptr A-54

Aplicatie medicala / asistent med...

De ce vor atația politicieni...
 ERR_ADDRESS_UNREACHABLE

Legea 18/1968 Se mai aplica?

Digi conectare 2 routere prin fir

Succesiune notar versus instanta ...
 Montaj aer conditionat in balcon ...

Cont curent mulți valuta far...

Sugestii plan casa

Experiente cu firme care cumpara ...
 

Lucru cu baze de date locale

- - - - -
  • Please log in to reply
27 replies to this topic

#1
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009
Salutare! Am o aplicatie in care vreau sa introduc anumite informatii intr-o baza de date. Am creat o baza de date locala (.sdf) din VB, totul functioneaza corect, dar am doua probleme pe care nu reusesc sa le rezolv:
1. Am un camp numit "Sex" de tipul bit pentru a alege Barbat/Femeie. Mi-am selectat din Data Source ca acel camp sa fie de forma Radio Button, apoi l-am pus intr-un group box si am mai adaugat un radio button separat. Cel implicit e "Barbat", iar cel adaugat de mine e "Femeie". Problema sau problemele sunt urmatoarele: rulez aplicatia, creez un nou rand (din uneltele implicite), selectez de exemplu Barbat si salvez. Pana aici e bine, dar apoi daca selectez Femeie si salvez din nou, imi da eroarea:
Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
Asta se intampla doar la crearea unui nou rand, nu si la actualizarea unuia creat la o rulare anterioara a aplicatiei. Si alta problema e ca daca selectez radio button-ul adaugat separat de mine, salvez si apoi trec la alt rand, cand revin acel radio button nu ramane selectat. Cum as putea sa rezolv problemele astea? Am tot cautat pe internet, dar nu am reusit sa ma lamuresc. Acelasi lucru l-as vrea si pentru un camp in care mi-ar trebui 5 radio button, iar fiecare sa introduca o valoare diferita intr-o coloana a bazei de date.

2. Am nevoie ca la apasarea unui buton sa parcurg toate randurile existente ale bazei de date si de acolo sa imi preiau informatiile din coloane pentru a face niste calcule. Cum as putea face asta?

#2
Yoda

Yoda

    Eternal padawan

  • Grup: Senior Members
  • Posts: 9,467
  • Înscris: 04.10.2002
Cum arata tabelul in care salvezi? Cum e definita cheia primara?

#3
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009

View PostYoda, on 20 aprilie 2013 - 21:25, said:

Cum arata tabelul in care salvezi? Cum e definita cheia primara?
In tabel am un camp NR de tipul int care e cheia primara, am alte 18 campuri asemanatoare cu cel la care vreau sa pun radio button (acelasi lucru voi face si la astea), apoi "Profesie" si "Varsta de tipul string, "Sex" si inca unul de tipul float.

Si daca tot ai intrebat de cheia primara, am vazut ca atunci cand rulez aplicatia si creez un rand, campul NR il trece cu minus. Abia dupa ce inchid si redeschid aplicatia le afiseaza pozitiv. E normal sa se intample asa?

#4
stupidcow

stupidcow

    Active Member

  • Grup: Members
  • Posts: 1,437
  • Înscris: 24.12.2004
In primul rand, tipul campului nu este bine ales, bit se foloseste, de obicei, pentru campurile booleene (true/false). Mai indicat ar fi fost un INT cu valori intregi: 1 - barbat, 2 - femeie.
Chestia cu concurrency vine din visual studio si apare cand modifici campuri pe form dupa ce ai salvat in baza de date.
E normal sa apara cu -1. Id-urile se genereaza temporar in aplicatie si, de-abia dupa ce se salveaza in baza de date, vor deveni ID-uri finale.

#5
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009

View Poststupidcow, on 20 aprilie 2013 - 21:45, said:

In primul rand, tipul campului nu este bine ales, bit se foloseste, de obicei, pentru campurile booleene (true/false). Mai indicat ar fi fost un INT cu valori intregi: 1 - barbat, 2 - femeie.

Asa m-am gandit si eu prima data, dar cautand o rezolvare la problema aia, toti spuneau ca pentru a face o astfel de constructie e necesar ca tipul de date sa fie bit. Imi poti spune, te rog, cum as putea face cu int (astfel incat sa indeplineasca dorintele mele precizate in primul post)? Presupun ca la fiecare selectare barbat/femeie, voi actualiza campul cu 1/2 dupa cum scrie aici http://msdn.microsof...9(v=vs.80).aspx . Dar ca sa imi ramana selectat radio button-ul si dupa ce mai umblu printre randuri si apoi revin, cum fac?

Edited by Alphasebi, 20 April 2013 - 22:01.


#6
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009
Nu aveti nicio idee?

#7
nexusm

nexusm

    Senior Member

  • Grup: Senior Members
  • Posts: 2,793
  • Înscris: 07.07.2011
poti folosi in continuare campul de tip bit cu conditia sa te raportezi tot timpul la un singur radio buton.
controlul radio buton returneaza nativ ca valoare true/false. ceea ce trebuie tu sa faci este ca in momentul actualizarii sau adaugarii de inregistrari sa te raportezi doar la unul din butoane (barbat sau femeie)
sa zicem ca alegi radio butonul barbat.
valoarea campului (bit) = radiobutonBarbat.Value
evident, la extragerea si folosirea informatiilor din baza de date se poate face conversia valorii campului in ceea ce ai nevoie:
Dim vSex As String
Dim xSex As Integer
Dim bSex As Boolean
If camp_sex = True Then
   vSex = "Barbat"
   xSex = 1
   bSex = True
Else
   vSex = "Femeie"
   xSex = 2
   bSex = False
End If

... cam asa ceva

#8
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
Poti folosi orice camp vrei dar cand faci UPDATE sa transmiti valorile cum trebuie.
Mai lasati deoparte codul generat automat de IDE cand nu stapaniti fenomenul si cititi ADO.NET sa intelegeti principiile: http://msdn.microsof...(v=vs.100).aspx

Edited by neagu_laurentiu, 24 April 2013 - 09:20.


#9
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009

View Postnexusm, on 24 aprilie 2013 - 09:16, said:


Ideea e ca atunci cand selectez un radio buton, celalalt se deselecteaza, deci checkbox-ul acelui camp de activeaza/dezactiveaza corect, problema apare cand vreau sa salvez acea inregistrare, atunci imi apare eroarea din primul post.
Nici nu stiu cum imi "selectez" o anumita coloana a liniei curente pentru a-i verifica valoarea sau pentru a o modifica. Tot caut pe internet, dar nu reusesc deloc sa ma lamuresc, nu functioneaza nici o varianta din cele gasite. Vroiam ca atunci cand dau click pe unul din butoane, sa imi editez singur valoarea acelui camp, poate ar rezolva acea eroare.

M-am gandit sa verific de fiecare data cand dau click pe sagetile implicite valoarea campului si in functie de ea sa imi selectez automat butoanele. Doar ca intervine problema de mai sus...

View Postnexusm, on 24 aprilie 2013 - 09:16, said:

Dim vSex As String
Dim xSex As Integer
Dim bSex As Boolean
If camp_sex = True Then
   vSex = "Barbat"
   xSex = 1
   bSex = True
Else
   vSex = "Femeie"
   xSex = 2
   bSex = False
End If
... cam asa ceva

Asta stiu, dar trebuie sa parcurg toate liniile si sa imi iau din fiecare informatii.

Edited by Alphasebi, 24 April 2013 - 22:45.


#10
nexusm

nexusm

    Senior Member

  • Grup: Senior Members
  • Posts: 2,793
  • Înscris: 07.07.2011
hai sa-ti reorganizam un pic Form-ul (ca si design)
zici la un moment dat ca dupa ce bifezi un radio el se debifeaza automat la bifarea altuia.
este ceva normal atata timp cat sunt amplasate in acelasi container(banuiesc ca la tine direct pe Form)
daca as avea de introdus 2 date spre exemplu, una fiind sexul si cealalta locatia, fiecare data putand avea doar 2 valori:
sex barbat/femeie
locatia bucuresti/alta localitate
cele 4 radio butoane le voi amplasa pe 2 Frame-uri diferite (Frame-urile putand fi vizibile sau nu)
cele 2 radio butoane 'sex' pe un frame (sa zicem ca l-am denumit frSex)
iar cele 2 pentu localitate pe un alt frame numit frLocalitate
pe aceeasi logica poti crea cate perechi de butoane vrei
(ca o particularitate, in cazul in care ai sa zicem mai multe posibilitati de raspuns, sa zicem 5, atunci vei pune 5 radio pe un Frame si ai control asupra posibilelor raspunsuri/valori)
asta ar fi problema 1

problema 2, cea cu eroarea de scriere in baza de date, am senzatia ca vine (cel putin asa am dedus din spusele tale) de la radio butonul 'femeie'
el nu este conectat la baza de date (cel putin nu ai specificat asta), conectat fiind doar 'barbat'
daca ai inteles exemplul meu de cod, scris mai devreme ai sa vezi ca pe mine nici nu ma intereseaza butonul 'femeie'
acesta are doar rolul de a dezactiva butonul 'barbat' si doar valoarea acestuia din urma o urmaresc si o scriu/editez in baza de date (true/false)

oricum, la fel ca neagu_laurentiu, te sfatuiesc sa renunti definitiv si pentru totdeauna la codul generat IDE de controale.
daca vrei cu adevarat sa folosesti baze de date singura solutie este aceea de a folosi cod facut de tine.
invata topica necesara ADO sau DAO si vei putea face ce vrei.
ca sa nu mai amintesc de o chestie, care intr-adevar nu este verificata de mine ca nu am folosit niciodata cod IDE, dar am citit pe net ca in aceste cazuri pot sa apara probleme de portabilitate a programului din cauza diferentelor de OS.
nu stiu daca asa este, dar asa am 'auzit' prin targ :)

bafta

#11
Yoda

Yoda

    Eternal padawan

  • Grup: Senior Members
  • Posts: 9,467
  • Înscris: 04.10.2002
Subscriu la ce a zis neagu_laurentiu. Renunta la obiectele definite in user interface, lucreaza cu ado.net in mod disconnected, in cod.

Modificari (update, insert, delete) faci folosind o conexiune si un sqlcommand, ceva de genul:

Dim connSQL As New SqlConnection(connstrSQL)
connSQL.Open()
Dim cmdSQL As New SqlCommand("DELETE FROM tblEmployees WHERE EmployeeID=" & intSelectedEmployee, connSQL)
cmdSQL.ExecuteNonQuery
connSQL.Close()


Navigare prin inregistrari, cu un dataadapter si un datatable. Ceva de genul:
Dim daEmployees As New SqlDataAdapter("SELECT * FROM tblEmployees WHERE camp_sex=1", connstrSQL)
Dim dtEmployees As New DataTable, dr As DataRow
daEmployees.Fill(dtEmployees)

For Each dr In dtEmployees.Rows
  'aici faci calculele de care ai nevoie, sau iti creezi o colectie de valori. Numele angajatului de exemplu (presupunand ca numele campului in tabel este EmployeeName) '
  Msgbox(dr!EmployeeName)
Next


Lucrand cu datele in mod disconnected, in cod, iti va fi mai usor sa intelegi ce se intampla cu informatiile introduse de utilizator sau cu cele aduse din baza de date.

Edited by Yoda, 25 April 2013 - 11:00.


#12
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009
O sa va urmez sfatul si o sa studiez ADO.NET, dar daca tot m-am apucat asa, as vrea sa ajung la vreun rezultat, macar pentru orgoliul meu. O sa rezolv aia cu radio butoanele, am in minte o idee si o sa o aplic.

In fine, ajutandu-ma de a doua secventa de cod data de tine am incercat sa imi verific toate liniile si sa imi incrementez un contor de fiecare data cand in campul "Profesie" este trecut Medic de exemplu (campul fiind de tipul nchar). Codul este asta:
	 Dim dtDataTable As DataTable
	 Dim strDetail As String
	 Dim test As Integer
	 test = 0
	 dtDataTable = New DataTable("tblChestionare")
	 For Each row As DataRow In dtDataTable.Rows
		 If row.Item("Profesie") = "Medic" Then
			 test = test + 1
		 End If
		 strDetail = row.Item("Profesie")
	 Next row
	 Label2.Text = test

Problema e ca nu imi intra niciodata in acel for. Afiseaza mereu 0 in Label2, desi am linii care ar indeplini conditia. Ce nu am facut bine?

Edited by Alphasebi, 25 April 2013 - 23:17.


#13
Yoda

Yoda

    Eternal padawan

  • Grup: Senior Members
  • Posts: 9,467
  • Înscris: 04.10.2002
Ai uitat de DataAdapter. E foarte important, el face legatura intre baza de date si datatable.

Ca o comparatie, gandeste-te ca datatable este un cofraj iar baza de date este betoniera. Fara un furtun care sa lege betoniera de cofraj, nu poti sa torni fundatia casei. Posted Image

Secventa ta de cod cu modificarile de rigoare:

Dim dtDataTable As DataTable
Dim test As Integer=0 ' In felul asta poti sa scrii o singura linie de cod, in loc de doua'
Dim strDetail As String
Dim da As New SqlDataAdapter("SELECT * FROM tblChestionare", connstrSQL) 'ATENTIE: aici presupunem ca ai asignat anterior variabilei connstrSQL stringul de conectare la baza de date'
dtDataTable = New DataTable("tblChestionare")
daEmployees.Fill(dtEmployees) 'Lini asta de cod e foarte importanta, leaga continutul selectat din baza de date cu "SELECT" de datatable'
For Each row As DataRow In dtDataTable.Rows
If row!Profesie.ToString = "Medic" Then 'Am utilizat tostring pentru a evita erorile cauzate de continut NULL in campul respectiv.'
test = test + 1 'poti sa scrii un pic mai ergonomic linia asta: test +=1 '
End If
strDetail = row!Profesie.ToString 'E posibil sa fii dezamagit de ce obtii. Vei avea valoarea campului "profesie" din ultima inregistrare din DataTable. nimic altceva...'
Next row
Label2.Text = test


Edited by Yoda, 26 April 2013 - 09:39.


#14
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009

View PostYoda, on 26 aprilie 2013 - 09:37, said:

Ai uitat de DataAdapter. E foarte important, el face legatura intre baza de date si datatable.

Ca o comparatie, gandeste-te ca datatable este un cofraj iar baza de date este betoniera. Fara un furtun care sa lege betoniera de cofraj, nu poti sa torni fundatia casei. Posted Image

Secventa ta de cod cu modificarile de rigoare:

Am adaptat codul tau si am mai adaugat ce trebuia adaugat (nu stiu cat de corect, m-am mai documentat si pe google, am incercat mai multe variante), dar e evident ca tot am gresit ceva, pentru ca tot nu intra in for. Codul este asta:
Dim connstrSQL As System.Data.SqlServerCe.SqlCeConnection = New System.Data.SqlServerCe.SqlCeConnection("Data Source=D:\Users\Administrator\My Documents\Visual Studio 2010\Projects\Statistica\Statistica\Chestionare.sdf")
		connstrSQL.Open()
		Dim dtDataTable As DataTable
		Dim test As Integer = 0 ' In felul asta poti sa scrii o singura linie de cod, in loc de doua'
		Dim strDetail As String
		Dim da As New SqlDataAdapter("SELECT * FROM tblChestionare", connstrSQL) 'ATENTIE: aici presupunem ca ai asignat anterior variabilei connstrSQL stringul de conectare la baza de date'
		dtDataTable = New DataTable("tblChestionare")
		Me.TblChestionareTableAdapter.Fill(Me.ChestionareDataSet.tblChestionare) 'Linia asta de cod e foarte importanta, leaga continutul selectat din baza de date cu "SELECT" de datatable'
		For Each row As DataRow In dtDataTable.Rows
			If row!Profesie.ToString = "Medic" Then 'Am utilizat tostring pentru a evita erorile cauzate de continut NULL in campul respectiv.'
				test = test + 1 'poti sa scrii un pic mai ergonomic linia asta: test +=1 '
			End If
			strDetail = row!Profesie.ToString 'E posibil sa fii dezamagit de ce obtii. Vei avea valoarea campului "profesie" din ultima inregistrare din DataTable. nimic altceva...'
		Next row
		Label2.Text = test
		connstrSQL.Close()



#15
Yoda

Yoda

    Eternal padawan

  • Grup: Senior Members
  • Posts: 9,467
  • Înscris: 04.10.2002
Linia asta:
Me.TblChestionareTableAdapter.Fill(Me.ChestionareDataSet.tblChestionare) 'Linia asta de cod e foarte importanta, leaga continutul selectat din baza de date cu "SELECT" de datatable'


nu e buna. Inlocuieste-o cu asta:
da.Fill(dtDataTable)


TblChestionareTableAdapter si ChestionareDataSet sunt obiectele create in IDE. Uita de ele!

#16
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009

View PostYoda, on 26 aprilie 2013 - 21:15, said:

Linia asta:
Me.TblChestionareTableAdapter.Fill(Me.ChestionareDataSet.tblChestionare)


nu e buna. Inlocuieste-o cu asta:
da.Fill(dtDataTable)


TblChestionareTableAdapter si ChestionareDataSet sunt obiectele create in IDE. Uita de ele!

Am incercat sa modific, dar imi da eroarea asta:

Quote

'Fill' is not a member of 'Statistica.SqlDataAdapter'.


#17
Alphasebi

Alphasebi

    Junior Member

  • Grup: Members
  • Posts: 40
  • Înscris: 15.12.2009
Nimeni?

#18
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
Decat sa-L astepti pe Hristos nu mai bine te uiti in documentatie sa vezi de ce nu gaseste metoda, ce tip e obiectul respectiv s.a.m.d asa cum iti spune eroarea ? Dumnezeu e in noi, nu in alta parte !

Edited by neagu_laurentiu, 01 May 2013 - 12:27.


Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate