Avatar billede dmk Nybegynder
25. august 2003 - 09:52 Der er 4 kommentarer

Læs GUID fra Oracle

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.
Avatar billede devmann Nybegynder
25. august 2003 - 10:07 #1
Du kan gøre sådan her ...

Dim MyGuid As Guid
MyGuid = New Guid(CType(DataRow(0), String))
Avatar billede dmk Nybegynder
25. august 2003 - 13:39 #2
Hejsa

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....
Avatar billede devmann Nybegynder
26. august 2003 - 07:41 #3
Jeg sidder desværre ikke med en Oracle database, men er godt hjemme i vb. Så jeg kan ikke afprøve og se, hvad problemer et .. sorry!
Avatar billede dmk Nybegynder
26. august 2003 - 09:48 #4
Okay Devmann, tak for forsøget.

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:

getInt(CollIdx)
getString(CollIdx)
getFloat(CollIdx)

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester