Ik ben al een tijdje bezig met een C# applicatie die verbinding maakt met een MySQL database via ODBC. Dit werkt allemaal prima en snel, en data opslaan en ophalen gaan erg goed. Maar nu wil ik graag bestanden opslaan (<16MB) in de database in een BLOB veld.
De volgende tabel gaan ze in:

opslaan gaat prima door via ODBC een parameterized query te maken en als paramater voor veld bestand netjes een bytearray mee geven. In MySQL Query browser kan ik dan netjes het bestand zien ("BLOB") en het bestand zelfs downloaden (handige util) en dan komt er inderdaad exact het bestand uit wat ik erin heb gestopt.
Echter nu wil ik de bestanden uit gaan lezen. De volgende code leek me logisch en staat bijna het zelfde in de MSDN
De grote ophalen gaat goed (via debugging de waarde van size bekeken)
De rij die opgehaald wordt is rij 4, en bij het debugging zie ik netjes dat die 6 kollomen heeft (in de reader) maar als ik dan row 3 probeer te lezen gaat het fout. Ik krijg de melding dat er geen data aanwezig is in die kolom. Zerobased is 3 de 4e kolom en dat klopt (volgende de comments is getBytes zero-based). Ook zomaar een andere kolomwaarde invoeren helpt niet, terwijl er gewoon zeker "iets" moet zijn. immers staat in elke kolom iets.
Ik heb gegoogled een daar heeft iemand het zelfde probleem. Volgens hem werkte het wel goed in .NET1.1 maar dat heb ik nooit geprobeerd. Zijn probleem wordt helaas niet opgelost. Als ik verder de MSDN examples van getBytes bekijk zie ik geen magisch andere code. (het is ook slechts 1 statement natuurlijk).
Ik ben nu 2 uur bezig geweest met die paar regels code maar ik blijf geen data krijgen maar een foutmelding dat er geen data is. Heeft iemand een idee waar het kan zitten?
De volgende tabel gaan ze in:

opslaan gaat prima door via ODBC een parameterized query te maken en als paramater voor veld bestand netjes een bytearray mee geven. In MySQL Query browser kan ik dan netjes het bestand zien ("BLOB") en het bestand zelfs downloaden (handige util) en dan komt er inderdaad exact het bestand uit wat ik erin heb gestopt.
Echter nu wil ik de bestanden uit gaan lezen. De volgende code leek me logisch en staat bijna het zelfde in de MSDN
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| //Even de Try's e.d. weggehaald om ruimte te besparen public byte[] Download(string table, string uid) { OdbcCommand getFileSize = new OdbcCommand("select * from " + table + " where uid = ?", odbcConnection); getFileSize.Parameters.Add(new OdbcParameter(String.Empty, uid)); Table ft = Select(getFileSize); //eigen Class die een tabel voorstelt string[] row = ft.getRow(0); //krijg de goede rij int size = Int32.Parse(row[2]); //en haal daaruit de grote van het bestand OdbcCommand getFile = new OdbcCommand("select * from " + table + " where uid = ?", odbcConnection); getFile.Parameters.Add(new OdbcParameter(String.Empty, uid)); byte[] file = null; odbcConnection.Open(); OdbcDataReader reader = getFile.ExecuteReader(System.Data.CommandBehavior.SequentialAccess); reader.GetBytes(3, 0, file, 0, size); //sluit code weggehaald return file; } |
De grote ophalen gaat goed (via debugging de waarde van size bekeken)
De rij die opgehaald wordt is rij 4, en bij het debugging zie ik netjes dat die 6 kollomen heeft (in de reader) maar als ik dan row 3 probeer te lezen gaat het fout. Ik krijg de melding dat er geen data aanwezig is in die kolom. Zerobased is 3 de 4e kolom en dat klopt (volgende de comments is getBytes zero-based). Ook zomaar een andere kolomwaarde invoeren helpt niet, terwijl er gewoon zeker "iets" moet zijn. immers staat in elke kolom iets.
Ik heb gegoogled een daar heeft iemand het zelfde probleem. Volgens hem werkte het wel goed in .NET1.1 maar dat heb ik nooit geprobeerd. Zijn probleem wordt helaas niet opgelost. Als ik verder de MSDN examples van getBytes bekijk zie ik geen magisch andere code. (het is ook slechts 1 statement natuurlijk).
Ik ben nu 2 uur bezig geweest met die paar regels code maar ik blijf geen data krijgen maar een foutmelding dat er geen data is. Heeft iemand een idee waar het kan zitten?