even situatie schetsen: (dit is NIET zomaar een huiswerktopic)
we moeten voor de lessen databanken en GUI's een kookboek in mekaar flansen.
dit gebeurt met Oracle 9i en VB.NET. de gebruikte datatoegang werkt via OLEDB.
we hebben ons ontwerp opgesteld voor de DB, en triggers/procedures geschreven.
dit alles werkt lekker, maar nu komen we even met de GUI in problemen.
even 1 tabel om als voorbeeld te gebruiken:
datum en actief dienen voor versioning.
1) die Datum was eerste van het 'timestamp' type. allemaal lekker en wel, maar bij het inlezen van de tabel met een dataadapter crashte het spul erop.
--> oplossing: procedure getDatum() die een string maakt van de SYSDATE op de server en die in een varchar stopt, gemakkelijk inleesbaar en converteerbaar in VB.NET
we moeten nu wel voor die versioning queries schrijven die die handel verwerken, maar met TO_DATE() trekken we onze slag wel denk ik...
2) het 2de probleem is ook weer datatype-gerelateerd.
wanneer ik een SELECT/DELETE-query uitvoer werkt alles lekker. wanneer ik echter een UPDATE doe loopt het mis.
wanneer ik hier dan voor de massadichtheid '1,2' (double) aan meegeef wil die het plots niet doen. ik krijg een error ala invalid number. ik denk dus aan hetzelfde als van die timestamp: incompatibele data types...
ik heb reeds vanalles geprobeerd:
(volgens mij ligt het probleem op die massadichtheid die hij niet wel converteren naar een float type in oracle, hoewel die beide ANSI compatible zouden moeten zijn?)
-->convert.tosingle()
-->in m'n getParameter functie:
vervangen door
en zelfs gewoon "'" + value + "'" hoewel dit hetzelfde is
-->google
-->got search
en nog wat andere normale dingetjes...
PS: ik bedenk net: zou het die Naam niet zijn??? want die heeft single quotes nodig?
we moeten voor de lessen databanken en GUI's een kookboek in mekaar flansen.
dit gebeurt met Oracle 9i en VB.NET. de gebruikte datatoegang werkt via OLEDB.
we hebben ons ontwerp opgesteld voor de DB, en triggers/procedures geschreven.
dit alles werkt lekker, maar nu komen we even met de GUI in problemen.
even 1 tabel om als voorbeeld te gebruiken:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| create table Ingredienten ( ID int not null , Naam varchar(40) not null , MassaDichtheid float default 1 not null, MaatID int not null , VoedselGroepID int not null , Datum varchar(20) not null , Actief int not null , check (Actief IN (0,1)) , primary key (Naam, Datum, Actief) , foreign key (MaatID) references Volumes(ID) , foreign key (VoedselGroepID) references VoedselGroepen(ID) ); |
datum en actief dienen voor versioning.
1) die Datum was eerste van het 'timestamp' type. allemaal lekker en wel, maar bij het inlezen van de tabel met een dataadapter crashte het spul erop.
--> oplossing: procedure getDatum() die een string maakt van de SYSDATE op de server en die in een varchar stopt, gemakkelijk inleesbaar en converteerbaar in VB.NET
we moeten nu wel voor die versioning queries schrijven die die handel verwerken, maar met TO_DATE() trekken we onze slag wel denk ik...
2) het 2de probleem is ook weer datatype-gerelateerd.
wanneer ik een SELECT/DELETE-query uitvoer werkt alles lekker. wanneer ik echter een UPDATE doe loopt het mis.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| 'DE UPDATE QUERY Private Const update_ingredient As String = "UPDATE Ingredienten SET Naam=:naam, MassaDichtheid=:massadichtheid,MaatID=:maatid,VoedselGroepID=:voedselgroepid WHERE ID=:id" '-------------------------------------------------------- 'VOLGENDE CODE IS PUUR TER VERDUIDELIJKING VAN MIJN WERKWIJZE frmMain.dSource.openConnection() For Each rij As DataRow In ingredienten.Rows Try If Convert.ToInt32(rij("ID")) = -1 Then 'insert Dim cmd As IDbCommand = frmMain.dSource.getCommand(insert_ingredient) Dim p As IDataParameter = frmMain.dSource.getParameter("massadichtheid", Convert.ToDouble(rij("Massadichtheid"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("maatid", Convert.ToInt32(rij("MaatID"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("voedselgroepid", Convert.ToInt32(rij("VoedselGroepID"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("naam", Convert.ToString(rij("Naam"))) cmd.Parameters.Add(p) Try frmMain.dSource.executeNonQuery(cmd) Catch ex As Exception 'ORA-20000 IS EEN CUSTOM TRIGGER-EXCEPTION DIE AANDUIDT DAT ALLES GELUKT IS If ex.Message.StartsWith("ORA-20000") Then cmd = frmMain.dSource.getCommand(insert_getID) cmd.Parameters.Add(p) rij("ID") = frmMain.dSource.executeScalar(cmd) Else MessageBox.Show(ex.Message) End If End Try Else 'update Dim cmd As IDbCommand = frmMain.dSource.getCommand(update_ingredient) Dim p As IDataParameter = frmMain.dSource.getParameter("naam", Convert.ToString(rij("Naam"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("massadichtheid", Convert.ToDouble(rij("Massadichtheid"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("maatid", Convert.ToInt32(rij("MaatID"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("voedselgroepid", Convert.ToInt32(rij("VoedselGroepID"))) cmd.Parameters.Add(p) p = frmMain.dSource.getParameter("id", Convert.ToInt32(rij("ID"))) cmd.Parameters.Add(p) frmMain.dSource.executeNonQuery(cmd) End If Catch ex As Exception If ex.Message.StartsWith("ORA-20000") Then 'ALLES OK Else MessageBox.Show(ex.Message) End If End Try Next frmMain.dSource.closeConnection() End Sub '------------------------------------------------- |
wanneer ik hier dan voor de massadichtheid '1,2' (double) aan meegeef wil die het plots niet doen. ik krijg een error ala invalid number. ik denk dus aan hetzelfde als van die timestamp: incompatibele data types...
ik heb reeds vanalles geprobeerd:
(volgens mij ligt het probleem op die massadichtheid die hij niet wel converteren naar een float type in oracle, hoewel die beide ANSI compatible zouden moeten zijn?)
-->convert.tosingle()
-->in m'n getParameter functie:
Visual Basic .NET:
1
| Return New OleDbParameter(":" + parameterName, value) |
vervangen door
Visual Basic .NET:
1
| Return New OleDbParameter(":" + paramterName,"'" + value.toString() + "'") |
en zelfs gewoon "'" + value + "'" hoewel dit hetzelfde is
-->got search
en nog wat andere normale dingetjes...
PS: ik bedenk net: zou het die Naam niet zijn??? want die heeft single quotes nodig?
ASSUME makes an ASS out of U and ME