» »

branje byte[] iz MS access-ove baze

branje byte[] iz MS access-ove baze

fr0sty ::

pozdravljeni ...

po dvodnevne sprehajanju mojega dobrega prijatelja googla še vedno nisem našel odgovora na svoj problem in se spet obračam veleume tega foruma :)

zadeva je sledeča...
Imam access-ovo bazo v kateri je tabela "datoteke" ter polja fileName,fileSize,file
V tabelo uspešno(vsaj tako se mi dozdeva) zapišem byte[] in sicer preprosto z querry-em:
"INSERT INTO datoteke(fileName,fileSize,file) VALUES('"+imeDatoteke+"','"+fSize+"','"+preberiByte(textBox1.Text)+"')"; ... funkcija preberiByte vrne byte[]..

Problem nastopi, ko želim vnešene podatke potegniti iz baze ter jih zopet zapisati v file...koda za to je sledeča...

folderBrowserDialog1.ShowDialog();
string lok=folderBrowserDialog1.SelectedPath;
DataSet izbrFile= new DataSet();
string ime=dataGrid1[vrsta,0].ToString();
OleDbConnection con= new OleDbConnection(povezi());
con.Open();

OleDbDataReader dr;

OleDbCommand cm= new OleDbCommand("SELECT fileName,fileSize,file FROM datoteke WHERE fileName='"+ime+"'",con);

byte[] file=new byte[long.Parse(dataGrid1[vrsta,1].ToString())];
dr=cm.ExecuteReader(System.Data.CommandBehavior.SingleRow);

while(dr.Read())
{
int x=dr.GetOrdinal("file");
dr.GetBytes(x,0,file,0,file.Length);
}
dr.Close();
con.Close();

zapisiByte(file,lok+ime); //zapiše byte[] na dano pot na disku

Problem je v tem, da ima byte[] ki ga dobim iz baze vedno enake vrednosti, in še to smao za prvih 10-15 pozicij ostalo pa so ničle. Z originalno datoteko se pa ne ujemajo niti tiste vrednosti ki jig DataReader prebere!..
Če se komu sanja kaj bi lahko bilo narobe ali pa pozna kako alternativo mojemu načinu se priporočam, ker je meni zmanjkalo idej....

LP

fr0sty ::

Kaj res nihče ne ve odgovora? ..... back to my best friend mr.google ... če pa komu le kaj pade na pamet tudi če je kaj, ki je vsaj malo povezano z mojo problematiko pa le z idejo na plan :D

LP

BHawk ::

Kako imaš definirano polje file v Access-u. Jaz ga imam definiran kot OLE Object.

Sem probal to narediti in mi v redu prebere.
Predvidevam da uporabljaš C#?

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\db1.mdb;Persist Security Info=False");
OleDbCommand com = new OleDbCommand("SELECT fileName,fileSize,file FROM ttt", con);

con.Open();
OleDbDataReader rdr = com.ExecuteReader();
byte[] b = null;
if(rdr.Read())
{
string f = "fileSize";
int ord = rdr.GetOrdinal(f);

int size = rdr.IsDBNull(ord)
? 0
: rdr.GetInt32(ord);

b = new byte[size];
ord = rdr.GetOrdinal("file");
rdr.GetBytes(ord, 0, b, 0, size);
}
rdr.Close();
con.Close();

Če ni gre povej, bom probal kaj drugega.

Zgodovina sprememb…

  • spremenil: BHawk ()

root ::

Pred parimi dnevi sem imel podben problem z sqlite bazo in zapisom slike v bazo. No uporablal sem tudi wxWindows in CppSqLite.
Problem je nastal če sem podatke skušal nest pri uporabi navadnega wxStringa (je nekaj enakega kot Cstring v mfc-ju). Takrat mi je pač skopiral nekaj 10 znakov slike v bazo, pa nič več. Pač problem sem rešo tako da sem uporabo CppSQLiteBuffer. Kolko sem vidal je fora tega buffera v tem da pač uporabla char polje.
Tak da vrjetno je tukaj tvoja rešitev problema. Probaj skopirat celi string v polje char. Potem pa se bi mogo fail pravilno shranit v bazo.

fr0sty ::

Hvala obema za odgovor...

@root
hmm..jaz pri tem svojem programu ne uporabljam ničesar drugeag kot byte[], ter tega direktno pošljem v Access bazo..če je bil tvoj odgovor vseeno za tako operacijo bi bil vesel če bi lahko malo bolje razložil, sem namreč še bolj zelen kar se prokramiranja tiče :)

@BHawk

Ja res se gre tukaj za c#..sem pozabil napisati...
V bazi imam tudi jaz OLE object polje za array. Ali obstaja še kak drug način kako iz baze dobiti array? V vseh člankih in howto-jih namreč nisem nikjer zasledil ničesar drugega kot uporabo DataReader-ja. Tvoj način je na žalost obrodil isto sadov kot moj :( se pravi še vedno mi stvar ne dela. Kot kaže bi znal problem biti drugje. Spodaj sem ti prilepil mojo funcijo, ki prebere file v byte[] preden se le ta zapiše v bazo ter pa funkcijo za zapis array-a ko/če pride iz baze :)...mogoče je napaka tam..kaj drugega mi pa žal ne pade na pamet :)..če pa poznaš še kako rešitev pa do share :)

LP
private byte[] preberiByte(string file)
{


FileStream fs= new FileStream(file,FileMode.Open,FileAccess.Read);
fSize=fs.Length.ToString();
BinaryReader preberi= new BinaryReader(fs);

byte[] prebraniFile= preberi.ReadBytes((int)fs.Length);
preberi.Close();
fs.Close();

return prebraniFile;
}
private void zapisiByte(Byte[] fileZAzapis,string kam)
{
FileStream zapisiFile= new FileStream(kam,FileMode.Create,FileAccess.Write);
BinaryWriter zapisi= new BinaryWriter(zapisiFile);

zapisi.Write(fileZAzapis);


zapisi.Close();
zapisiFile.Close();

}

BHawk ::

Ne vem zakaj uporabljaš BinaryReader saj FileStream vrača byte[]:

FileStream fs = new FileStream(@"C:\Temp\file.xxx", System.IO.FileMode.Open, System.IO.FileAccess.Read);

long tmp = fs.Length;
byte[] b = new byte[(int)tmp];
fs.Read(b, 0, (int)tmp);

fs.Close();

Za zapis v bazo pa tako:
OleDbCommand com = new OleDbCommand("INSERT INTO ttt(fileName,fileSize,file) VALUES(?,?,?)", con); // con = konekcija do Accessa

com.Parameters.Add("a", @"C:\Temp\file.xxx"); // Ime file-a
com.Parameters.Add("b", len); // Dolžina byte[]
com.Parameters.Add("c", b); // b = byte[] iz FileStream-a

con.Open();
com.ExecuteNonQuery();
con.Close();

To bi moralo delati kajti meni na ta način zapiše txt, ter jpg datoteke
in sigurno še druge ampak nisem probal.
Katero verzijo Access-a imaš jaz imam namreč 2000!

BHawk ::

Za zapis v datoteko prav tako FileStream deluje:
FileStream fs = new FileStream(@"C:\Temp\file.xxx", System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
fs.Write(tmp, 0, tmp.Length); // tmp = byte[] prebran iz baze.
fs.Close();


LP BHawk

Zgodovina sprememb…

  • spremenil: BHawk ()

fr0sty ::

:)) :)) :)) Dela ko švajcerska urca !! :D

No pa je na svtu še en začetnik ki več ve :D
če se kdaj kje srečamo imaš v dobrem pir!!

Imam samo še eno vprašanje. Zadeva je začela delovati šele takrat, ko sem zamenjal svoj OleDbCommand statement s tvojim. Ali je med njima kakšna razlika?

Moj je šel takole:
string sqlSTR="INSERT INTO datoteke(fileName,fileSize,file,CRC)
VALUES('"+imeDatoteke+"','"+fSize+"','"+buffer+"','"+crc.ToString()+"')";
OleDbCommand vstavi= new OleDbCommand(sqlSTR,povezava);

Ali je med njima kakšna očitna razlika??

LP ter še enkrat hvala

BHawk ::

Načeloma bi moralo delovati, vendar je buffer kot string definiran in verjetno ni pravilen.

lp, za pir se bove že kako zmenla:)

Zgodovina sprememb…

  • spremenil: BHawk ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL problem

Oddelek: Programiranje
141309 (927) win64
»

VC# insert into oledb ne deluje

Oddelek: Programiranje
191347 (1118) Good Guy
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
71753 (1558) darkolord
»

problem v C#

Oddelek: Programiranje
211677 (1392) dvojka
»

OleDb in visual studio .net

Oddelek: Programiranje
161946 (1725) Kovalchuk

Več podobnih tem