Toon posts:

[VB.NET] image invoegen in BLOB (oracle)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik gebruik een dataset om een image in een database in te voegen en gebruik daar volgende functie om de image als byteArray door te geven:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
Private Function GetBytes(ByVal fname As String) As Byte()
Dim reader As New BufferedStream(New FileStream(fname, FileMode.Open, FileAccess.Read))
        Dim buffer(CInt(reader.Length) - 1) As Byte
        reader.Read(buffer, 0, CInt(reader.Length))
        Return buffer
End Function

Sub addfile, alles wordt goed in de bytearray geplaatst (getest door naar string om te zetten):
Dim b() As Byte = GetBytes(fileName)
objDataRow.Item("Data") = b


In de dataset staat het element data op “byte” ook heb ik hier string geprobeerd maar dit werkt alsook niet.

Ik gebruik volgend statement om de insert te doen:=
Visual Basic:
1
MyBase.AddParameter("inData", OracleClient.OracleType.Blob, File.Tables("File").Rows(0).Item("Data").ToString.Length, CType(File.Tables("File").Rows(0).Item("Data"), Byte()))

Heb ook ctype oracleLob trachten te gebruiken

Ik blijf volgende exception krijgen:
Visual Basic:
1
2
3
4
5
6
7
8
Error:

An unhandled exception of type 'System.ArgumentException' occurred in system.data.dll

Additional information: System.InvalidCastException: Specified cast is not valid.
   at System.Convert.ToSByte(Object value)
   at System.Data.Common.SByteStorage.Set(Int32 record, Object value)
   at System.Data.DataColumn.set_Item(Int32 record, Object value)Couldn't store <System.Byte[]> in Data Column.  Expected type is SByte.


Maar begrijp niet waar het fout gaat :? :?
Waar kan het probleem toch liggen?

[ Voor 4% gewijzigd door Verwijderd op 04-03-2006 17:30 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

probeer eens sbyte als type te gebruiken ipv byte
(sbyte = signed byte van -127 tot 128, byte = unsigned byte van 0 tot 255)

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
doet het ook niet met SByte, hoop echt dat iemand het weet want heb al uren zitten zoeken achter een oplossing.

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Krijg je dan dezelfde foutmelding?

Verwijderd

Topicstarter
ja nog steeds dezelfde foutmelding

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

hij verwacht blijkbaar geen array, maar een enkele waarde.

Convert.ToSByte(...) converteert naar 1 SByte. Een array doorgeven geeft geheid problemen...

Je moet dus het datatype in de dataset op iets anders zetten.
liefst dan nog typeof(OracleClient.OracleType.Blob) waarna je de Image hiernaar converteert.

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
volgende datatypes kan ik in de dataset instellen (die mogelijk gebruikt kunnen worden):

anyType, anyURI, base64Binary, boolean, byte, double, hexBinary, string, token, unsignedByte

ik heb nu base64Binary gekozen, dit werkt nu, maar moet nog een cast doen naar de database toe, welke zou ik dan moeten gebruiken?

ik krijg nu namelijk deze error (dus er moet iets gebeuren met dat veld dat nu in base64Binary staat om naar BLOB om te kunnen zetten)
Visual Basic:
1
2
3
4
Additional information: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'FILEINSERT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

[ Voor 73% gewijzigd door Verwijderd op 05-03-2006 17:07 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

kijk even op Convert.ToBase64String of Convert.ToBase64CharArray

edit: my fault.
je zal even moeten zoeken welk type er compatibel mee is.
Ik vraag me ook af of dit niet beschreven staat in de documentatie van de OracleClient dll

[ Voor 58% gewijzigd door H!GHGuY op 05-03-2006 18:08 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
ik denk dat ik nu tochal iets verder ben.
geef de foto aan de dataset dmv
Visual Basic:
1
Convert.ToBase64String(GetBytes(fileName))

en geef het dan mee als value als:
Visual Basic:
1
CType(Convert.FromBase64String(File.Tables("File").Rows(0).Item("Data").ToString), OracleClient.OracleLob)

heb ook een console writeline gedaan om te kijken of de data er wel inzit en hij print deze data dus ook.

maar krijg nog steeds dezelfde foutmelding van oracle.

op volgende website staat dat ik oracleLob kan gebruiken:
http://msdn2.microsoft.co...cleclient.oracletype.aspx
zo heb ik dat dan ook gedaan zoals u hierboven ziet maar krijg dan een melding van 1-dimensional byte kan not be converted to string.

[ Voor 60% gewijzigd door Verwijderd op 05-03-2006 22:32 ]


Verwijderd

Topicstarter
het probleem is opgelost.
ik had ook nog een veld dat naar een andere tabel verwijsde nog niet in de dataset.

volgende code werkt goed voor het in de database plaatsen van een image:
Visual Basic:
1
2
3
4
5
6
    Private Function GetBytes(ByVal fname As String) As Byte()
        Dim reader As New BufferedStream(New FileStream(fname, FileMode.Open, FileAccess.Read))
        Dim buffer(CInt(reader.Length) - 1) As Byte
        reader.Read(buffer, 0, CInt(reader.Length))
        Return buffer
    End Function

Visual Basic:
1
objDataRow.Item("Data") = Convert.ToBase64String(GetBytes(fileName))


Visual Basic:
1
2
3
Dim data() As Byte
data = New Byte(File.Tables("File").Rows(0).Item("Data").ToString.Length) {}
data = Convert.FromBase64String(File.Tables("File").Rows(0).Item("Data").ToString)


Visual Basic:
1
MyBase.AddParameter("inData",OracleClient.OracleType.Blob, data.Length,data)
Pagina: 1