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 |
Lucru cu baze de date locale
#1
Posted 20 April 2013 - 20:31
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
Posted 20 April 2013 - 21:25
Cum arata tabelul in care salvezi? Cum e definita cheia primara?
|
#3
Posted 20 April 2013 - 21:38
Yoda, on 20 aprilie 2013 - 21:25, said:
Cum arata tabelul in care salvezi? Cum e definita cheia primara? 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
Posted 20 April 2013 - 21:45
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
Posted 20 April 2013 - 21:57
stupidcow, 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. |
#7
Posted 24 April 2013 - 09:16
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
Posted 24 April 2013 - 09:19
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
Posted 24 April 2013 - 22:36
nexusm, 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... nexusm, 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
Posted 25 April 2013 - 10:41
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
Posted 25 April 2013 - 10:54
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
Posted 25 April 2013 - 23:15
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 = testProblema 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
Posted 26 April 2013 - 09:37
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. 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
Posted 26 April 2013 - 19:51
Yoda, 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. 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
Posted 26 April 2013 - 21:15
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
Posted 27 April 2013 - 20:06
Yoda, 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'. |
#18
Posted 01 May 2013 - 12:26
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
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users