Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa spremanjem/citanjem datoteka sa SQL Servera

[es] :: .NET :: .NET Desktop razvoj :: problem sa spremanjem/citanjem datoteka sa SQL Servera

[ Pregleda: 1301 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

marko v
programer
Šibenik

Član broj: 46810
Poruke: 109
*.adsl.net.t-com.hr.

Sajt: www.bono-husky.tk


Profil

icon problem sa spremanjem/citanjem datoteka sa SQL Servera14.05.2009. u 10:19 - pre 181 meseci
Kao sto naslov teme kaze imam problem sa spremanjem i citanjem datoteka sa SQL Servera.
Datoteke držim u varbinary(max) polju u tabeli.
code za spremanje u bazu
Code:

   FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
                    Byte[] fileAsByte = new Byte[fs.Length];
                    fs.Read(fileAsByte, 0, Convert.ToInt32(fs.Length));
                    

                    SqlConnection konekcija = new SqlConnection(RazneDatotekeBaza.Properties.Settings.Default.testnaCS);
                    SqlCommand dodajFile = new SqlCommand("update unosDatoteka  set datoteka = @FileStream where sifra = '" +
 unosDatotekaDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString().Trim() + "'", konekcija);
                    SqlParameter imageParameter = dodajFile.Parameters.Add("@FileStream",SqlDbType.VarBinary);
                    imageParameter.Value = fileAsByte;
                    imageParameter.Size = fileAsByte.Length;

                    konekcija.Open();
                    dodajFile.ExecuteNonQuery();
                    konekcija.Close();
                    fs.Close();


code za spremanje fajla na disk i njegovo otvaranje:
Code:

SqlConnection konekcija2 = new SqlConnection(RazneDatotekeBaza.Properties.Settings.Default.testnaCS);
SqlCommand cmdSelect = new SqlCommand("select datoteka from unosDatoteka where sifra =  '" +
unosDatotekaDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString().Trim()+ "'", konekcija2);
konekcija2.Open();
byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
konekcija2.Close();

string strfn = String.Format("{0}{1}{2}", System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetModule("RazneDatotekeBaza.exe").FullyQualifiedName).ToString(), 
"\\Temp\\", unosDatotekaDataGridView.Rows[e.RowIndex].Cells[2].Value.ToString().Trim());
FileStream fsx = new FileStream(strfn, FileMode.Create,FileAccess.ReadWrite);
fsx.Write(barrImg, 0, barrImg.Length);
fsx.Flush();
fsx.Close();
Process.Start(strfn);

unosDatotekaDataGridView među ostalima ima kolone sifra (primarni kljuc,index kolone 0 ) i dokument ( originalni naziv dokumenta , npr. moj.pdf , sa indexom kolone 2).
Nigdje se ne pojavljuje nikakva greska, a recimo ako otvaram pdf foxit readerom foxit javlja: not a pdf or corrupted.
Gdje grijesim?
 
Odgovor na temu

marinko.jovanovic
Marinko Jovanović
.NET Developer, Ipsylon d.o.o
Novi Sad

Član broj: 173762
Poruke: 6
*.static.isp.telekom.rs.



Profil

icon Re: problem sa spremanjem/citanjem datoteka sa SQL Servera15.05.2009. u 07:47 - pre 181 meseci
Snimanje fajla u bazu

FileStream fileStreamTest = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
byte[] DocBuffer = new byte[(Int32)fileStreamTest.Length];
fileStreamTest.Read(DocBuffer, 0, ((Int32)fileStreamTest.Length));
SqlConnection conn = new SqlConnection(@"Data Source=server;Integrated Security=SSPI;Initial Catalog=Test");
SqlCommand cmd = new SqlCommand("sp_DocumentsUploadFile", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@DocName ", SqlDbType.VarChar, 200);
cmd.Parameters.Add("@Doc", SqlDbType.Image);
cmd.Parameters.Add("@DocType", SqlDbType.VarChar, 4);
cmd.Parameters[0].Value = FileName;
cmd.Parameters[1].Value = DocBuffer;
cmd.Parameters[2].Value = strDocType;

conn.Open();
cmd.ExecuteNonQuery();
conn.Close();


///Ucitavanje fajla iz baze i prikazivanje (u bazu sam smjestio i ekstenziju fajla da mi ne bi iskakao onaj prozor za odabir kojim cu programom da otvorim fajl):

//Primjera radi povuci cu samo zapis iz baze sa id=1

int documentId=1;

byte[] retVal = new byte[] { };
SqlConnection conn = new SqlConnection(@"Data Source=server;Integrated Security=SSPI;Initial Catalog=Test");
const string SQL = "SELECT [Doc] FROM [DocumentsUpload] WHERE [DocId] = @DocId";
SqlCommand myCommand = new SqlCommand(SQL, conn);
myCommand.Parameters.AddWithValue("@DocId", documentId);

conn.Open();
SqlDataReader myReader = myCommand.ExecuteReader();

if (myReader.Read())
{
retVal = ((byte[])myReader["Doc"]);
}

FileStream fileStream = new FileStream("C:\\test.pdf", FileMode.Create, FileAccess.ReadWrite);

//VEOMA BITNO DA FAJL UPISUJES POMOCU BinaryWritera (inace ti baca tvoju gresku)

BinaryWriter binaryWriter = new BinaryWriter(fileStream);

for (int i = 0; i < retVal.Length; i++)
{
binaryWriter.Write(retVal);
}

binaryWriter.Close();
fileStream.Close();
Process.Start("C:\\test.pdf");

Odmah sam kreirao fajl "test.pdf", a ti naravno mozes da koristis proizvoljnu lokaciju za smjestanje fajla.

Nadam se da ce pomoci bar malo.

 
Odgovor na temu

marko v
programer
Šibenik

Član broj: 46810
Poruke: 109
*.adsl.net.t-com.hr.

Sajt: www.bono-husky.tk


Profil

icon Re: problem sa spremanjem/citanjem datoteka sa SQL Servera16.05.2009. u 14:09 - pre 181 meseci
da, sa BinaryWriterom radi odlicno.na manjim datotekama.
novi problem su velike datoteke, od nekoliko stotina MB.
gdje ucitavanje u byte[] baca System.OutOfMemoryException

ucitavanje u bazu sam riješio koristeći sql openrowset( bulk ....
ali nemogu naći način da iscitam file iz baze bez da punim byte[]
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: problem sa spremanjem/citanjem datoteka sa SQL Servera

[ Pregleda: 1301 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.