[ marko v @ 14.05.2009. 10:19 ] @
| 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? |
[ marinko.jovanovic @ 15.05.2009. 07:47 ] @
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.
[ marko v @ 16.05.2009. 14:09 ] @
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[]
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.