Toon posts:

[oracle] GUID .NET

Pagina: 1
Acties:

Verwijderd

Topicstarter
ben op dit moment met wat C# code bezig die o.a. een .NET GUID in oracle opslaat. Hiervoor heb ik een RAW(16) veld aangemaakt als PK NOT NULL en dit werkt allemaal lekker als ik stored procs hanteer.

Nu wil ik echter een uitzondering maken en handmatig een sql-statement afvuren.
Nu dacht ik, dan sloop ik de -'jes ertussen uit en insert ik de GUID als lang HEX-string-ding.
Is dit de manier? of moet ik het anders doen, heb namelijk het idee dat dat niet klopt.
Als ik het geheel check met SQL-Plus klopt de waarde wel...

Nu gaat alleen het uitlezen verkeerd, Daar gebruik ik een IDataReader voor (oracle client). Dus iets van dr.ReadGuid(0); Dan krijg ik de volgende Guid... Het eind klopt, maar het begin is geshuffled en dus fout... :?

In Oracle-DB: 4275dd3f258e4bec9d01d708c12ff921
Ingelezen met .net: {3fdd7542-8e25-ec4b-9d01-d708c12ff921}

Iemand een helder idee????????

code:
1
2
3
4
5
6
g = {4275dd3f-258e-4bec-9d01-d708c12ff921}

sql = "INSERT INTO GW_AQUO_ELEMENTS VALUES('4275dd3f258e4bec9d01d708c12ff921',0,'OKNOMSC1','Naam1','Omschr1')"

resultaat in oracle
4275DD3F258E4BEC9D01D708C12FF921

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 12:49

mulder

ik spuug op het trottoir

Als je als string leest, en dan cast naar een guid. Er zit voor .Net volgens mij geen GUID in denk ik?

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Je kan ook gebruik maken van een parametrized query, die je dan je GUID's aanlevert.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Wat ik niet snap is dat de .NET provider het omtovert naar een ander GUID. :?
wil het perse als RAW(16) formaat opslaan dus niet iets van VARCHAR2(32).

{dae71e5e-2c1e-4aea-b3a6-91314587e7ba} GUID c# type insert value
"dae71e5e2c1e4aeab3a691314587e7ba"insert in oracle als 'dezeguid'

ingelezen: dr.GetGuid OF dr.GetValue(byte[] obj) en dan gecast naar Guid
{5e1ee7da-1e2c-ea4a-b3a6-91314587e7ba}

:? :?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Het is geen ander GUID, het is een ander formaat. Iets met big/little endian.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
kenneth schreef op maandag 29 mei 2006 @ 15:20:
Het is geen ander GUID, het is een ander formaat. Iets met big/little endian.
--------------------------
The adjectives big-endian and little-endian refer to which bytes are most significant in multi-byte data types and describe the order in which a sequence of bytes is stored in a computer’s memory.
In a big-endian system, the most significant value in the sequence is stored at the lowest storage address (i.e., first). In a little-endian system, the least significant value in the sequence is stored first. For example, consider the number 1025 (2 to the tenth power plus one) stored in a 4-byte integer:

OK, maar met een stored procedure in dotnet AddParameter werkt het wel, dus ik concludeer hieruit dat ik de .NET GUID {xxxx-xxx-xxx-.....} anders moet omzetten en wegschrijven? DUs niet alleen de -'jes eraf slopen, maar iets advanced?

Wat een rampenverhaal. In SQL-server 2005 is 't gewoon lekker compatible, maar ja, dat zijn MS spulle .NET en SQL-SERVER2005. Waarom heeft Oracle niet gewoon een GUID type?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

{3fdd7542-8e25-ec4b-9d01-d708c12ff921} is gewoon een 'leesbare' notatie voor het 128-bits getal (want dat is een GUID feitelijk) 0x4275dd3f258e4bec9d01d708c12ff921.

Je kan dus niet zomaar de streepjes verwijderen, maar je moet de GUID als een 128-bits getal afdrukken en die gebruiken.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Ok, dus dan ligt het probleem bij het wegschrijven. Stel ik heb de volgende array,

byte[] guidbytes = g.ToByteArray(); Dat ding heeft 16 items met getallen van 0..255.
Deze moet ik dan per item omzetten naar hex? Iemand een idee?
Had ik maar de dotnet framework code die dat ook doet, maar dan intern.

code:
1
2
Wegschrijven
oracle_c1.Parameters.Add(new OracleParameter("inGroupID", OracleType.Raw)).Value = Guid.NewGuid().ToByteArray();

Inlezen
code:
1
2
3
Byte[] b = new byte[16];
rdr.GetBytes(0, 0, b , 0, 16);
Guid id = new Guid(b);

Verwijderd

Topicstarter
:)

't is gelukt! thanx iedereen... heb de ByteArray naar HEX geklust en dat geinsert en dat daarna weer opgehaald, en 't is dezelfde waarde! dus top!

code:
1
2
3
4
5
6
7
        public string ToHexString(byte[] bytes)
        {
            string hexString = "";
            for (int i = 0; i < bytes.Length; i++)
                hexString += bytes[i].ToString("X2");
            return hexString;
        }
Pagina: 1