Jeg har forsøgt at finde ud af, hvordan man kan læse et felt af typen GUID ud fra et recordset med ADO.
Når man udfører en sql (eller kalder en Stored Procedure) i SQL Server der returnerer et felt af typen GUID, har ADO en GUID-type, som har konverteret det binære 16-byte felt i databasen til en streng ( noget i stil med "{0FA09167-BC10-9403-1231-4598FCC49AC3}" ), og denne værdi kan man så håndtere som en streng i VB.
Men når man kalder en tilsvarende SQL eller Stored Procedure i Oracle, får man det ud som binær data, og det kan ikke umiddelbart konverteres til en streng. Man kan selvfølgelig selv give sig til at konvertere det, ved at løbe de 16 binære bytes igennem, men det vil give et kæmpe manuelt konverterings arbejde, og ødelægge nogle generelle interfaces, der helst ikke skulle kende typen på databasen.
En løsning er, at man laver en CAST til en streng i databasen, men dette er bestemt heller ikke en elegang løsning, da man ikke nødvendigvis ønsker at hive binære nøglefelter ud som streng i ALLE sine applikationer.
Det leder mig så (endelig) frem til mit spørgsmål: Kan man på en eller anden måde typeangive sit resultat? Jeg har hørt, at i VB.net findes der ToString på alle objekter, men det gør der vist ikke i den "gamle" VB? Det jeg gerne ville have, var at jeg på en eller anden måde kunne sige:
ResultSet.SetColumnType(1, STRING)
og så konverterede ADO driveren selv resultatsættet til den foretrukne type.
Typen af feltet i Oracle er i øvrigt RAW(16), hvis det skulle have nogen interesse.
Jeg skal vist lige skynde mig at sige, at jeg er stort set uduelig i VB. Jeg er Oracle og C++ udvikler, så bær over med mig.
Jeg har selv skrevet en funktion som kan konvertere RAW(16) værdierne til en streng:
GetHexString(Value() as byte) dim RetVal as string dim idx as integer for idx=0 to 15 step 1 RetVal=RetVal+Hex(Value(idx)) next idx GetHexString=RetVal
Den fungerer sådan set udemærket, og gør vel i princippet det samme som dit eksempel. Jeg prøvede dog dit eksempel, og kunne ikke få det til at virke. Guid kunne ikke tage parametre i constructoren (eller hvad det nu hedder i VB) og jeg fik fejlen "expected: End of statement". Jeg fjernede derfor parameteren, og prøvede så at køre det. Så fik jeg følgende fejl i NEW-linien: "Variable uses an automation type not supported in Visual Basic".
Men det er sådan set også ligegyldigt, for mit problem består i, at jeg gerne vil kunne definere typen på resultatsættet der returneres fra Oracle en gang for alle, og når man så tilgår ResultSet.Fields(IDX).Value, får man den streng jeg gerne vil have. Grunden til dette er, at Oracle-delen skal kunne arbejde sammen med en hel del allerede eksisterende kode, som er blevet skrevet til SQL Serveren, hvor ResultSet.Fields(IDX).Value giver en streng, når den indeholder en GUID. Og da man helst ikke vil skrive en masse database-specifik kode, skal det helst kunne fungere på samme måde fra begge databaser. Så jeg har brug for at kunne specificere typen på mit resultset, og derefter behandle resultsættet helt uafhængig af, at det i databasen er en RAW.
Det er muligt jeg leder efter noget der ikke eksisterer og kan lade sig gøre, men sam sagt ved jeg ikke så meget om VB. Jeg ville uden problemer kunne lave lige præcis dette trick i C++ via ODBC, men det hjælper mig jo ikke så meget i VB....
Men det er nu heller ikke så meget et spørgsmål om Oracle. Det er mere et spørgsmål om, hvordan man får ADO-driveren til at konvertere kolonner for en.
I OCCI (Oracle Class Call Interface) til C++ findes der funktioner til at hive data ud i lige præcis det format man ønsker. Funktionerne hedder fx:
I ODBC (også til C++) findes der én funktion der kan det hele:
SQLSetDataBuffer(CollIdx, TYPE, Buffer) // ( Lidt forsimplet ) Hvor TYPE parameteren angiver hvilket format ODBC skal konvertere værdien til, og denne værdi puttes derefter i Buffer parameteren. Hvis man fx. vil have værdier ud som en integer, giver man SQL_INTEGER som type, og giver en pointer til en integer i Buffer parameteren. På denne måde kan man få ODBC-driveren til selv at konvertere data til lige nøjagtig det man gerne vil have, uafhængig af hvilken database man går på.
Det er noget i den stil jeg har ledt efter i ADO/VB uden held.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.