[asp.net] bestand van schijf naar sql server

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Hallo,

Ik kom op het interenet vele tutorials tegen over hoe bestanden in sql server op te slaan en hoe bestanden aan te maken. Mijn probleem is alleen dat ik op zoek ben naar een combinatie van beiden. Op de server worden namelijk Word-documenten gegenereerd aan de hand van gegevens uit de database (wat goed werkt). Deze documenten moeten in sql server opgeslagen worden. Ik heb alleen geen idee hoe ik zoiets aan zou moeten pakken. De code die ik gebruik gebruikt een inputstream om het bestand uit het formulier te halen, dus ik denk dat ik daar ook iets mee moet doen. In google vind ik ook niks. Kan iemand me even een duwtje in de goede richting geven?

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ipv het document op te slaan, kan je natuurlijk ook het pad naar het document op de server in je databank opslaan.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat is precies het probleem?
Je weet hoe je een bestand van de harde schijf kan lezen?
Je weet hoe je een bestand in SQL Server op moet slaan?

Dan kan je deze twee stappen toch gewoon combineren?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Ik vind alleen tutorials over hoe je de inhoud van een bestand kan lezen (een textbestand bijvoorbeel), maar ik wil alleen een bestand van de harde schijf in de database zetten.

Edit:
Ik vermoed dat ik iets met een binaryreader moet doen?

[ Voor 17% gewijzigd door sig69 op 05-01-2004 14:45 ]

Roomba E5 te koop


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult je bestand voor een word document inderdaad binair in moeten lezen. Ik weet even niet uit mijn hoofd welke reader/inputstream je daarvoor moet gebruiken, maar daarvoor zal je even in de documentatie moeten kijken. Met de naam BinaryReader zit je denk redelijk goed.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Voor de geinteresseerden:

Ik heb het nu zo gedaan:
C#:
1
2
3
4
5
6
7
8
// Create a filestream to open the document
FileStream fs = new FileStream(Request.MapPath(@"~DocsDocX.doc"),System.IO.FileMode.Open,System.IO.FileAccess.Read);
//Read the output in a stream reader
StreamReader sr = new StreamReader(fs);
// Create a bytearray to hold the document's contents
byte[] byteArray = new byte[fs.Length];
// Fill the bytearray
fs.Read(byteArray,0,System.Convert.ToInt32(fs.Length));
Daarna kan je het bestand gewoon in SQL server wegschrijven

Edit: Dit gaat dus niet altijd goed, ik krijg af en toe de melding "The process cannot access the file "c:ProjectsWebdevelopmentDocsDocX.doc" because it is being used by another process." Ik vermoed dat dit komt doordat het proces dat het document genereert het bestand nog gelocked heeft. Weet iemand hoe ik het bestand daarna weer kan vrijgeven?

Edit2: Excuses, het bestand wordt niet gegenereerd met een filestream maar met een WordDocumentPrinter (een component dat hier intern gebruikt wordt) Iemand bekend hiermee?

[ Voor 38% gewijzigd door sig69 op 08-01-2004 09:45 ]

Roomba E5 te koop


Verwijderd

de fs netjes closen en destroyen (ben geen C#-er, dus ff geen code)?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Zoals reeds gezegd:
De FileStream en/of de StreamReader closen.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Sowieso: Waarom hardcoded een bestandsnaam in je code? Waarom heb je die niet als instelling in je web.config gezet?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Ik zal even wat meer code posten:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Create the Word document
string fileLocation = @"~\Docs\DocX.doc";
string destination = Request.MapPath(fileLocation);

WordDocumentPrinter.Save(path, contractValues, destination);

// Create a filestream to open the document
FileStream fs = new FileStream(Request.MapPath(@"~\Docs\DocX.doc"),System.IO.FileMode.Open,System.IO.FileAccess.Read); //Hier gaat het fout
// Read the output in a stream reader
StreamReader sr = new StreamReader(fs);
// Create a bytearray to hold the document's contents
byte[] byteArray = new byte[fs.Length];
// Fill the bytearray
fs.Read(byteArray,0,System.Convert.ToInt32(fs.Length));
Op het moment dat de filestream geopend wordt gaat het fout. Aangezien er daarvoor geen filestreams gebruikt worden kan ik die ook niet sluiten. Ik vermoedt dat de WordDocumentPrinter op het moment dat de filestream gemaakt wordt gewoon nog niet klaar is met het aanmaken van het bestand. Valt dat niet te controleren?

Roomba E5 te koop


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Vraag de bestandsstatus eens op direct voor en direct na WordDocumentPrinter :) Dan weet je het zeker. :)

[ Voor 8% gewijzigd door gorgi_19 op 08-01-2004 10:09 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Hoe doe ik dat?

A, ik zat al naar een document status functie te zoeken...

[ Voor 88% gewijzigd door sig69 op 08-01-2004 10:32 ]

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
File.Exists()

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:18
Voor WordDocumentPrinter: false
Na WordDocumentPrinter: true

Het bestand bestaat dus wel, de vraag is alleen of het bestand wel "af" is. Ik ga het bestand opslaan in de de database wel even onder eeen button event hangen, kijken hoe dat werkt.

Edit: Dat werkt dus perfect, het is dus gewoon die WordDocumentPrinter die het bestand nog in gebruik heeft. Iemand een idee hoe ik kan controleren wie/of een bepaald bestand in gebruik is?

Edit2:Als ik het zo doe:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Create a filestream to open the document
FileStream fs;
while (fs == null)
{
    try
    {
        fs = new FileStream(Request.MapPath(@"~DocsDocX.doc"),System.IO.FileMode.Open,System.IO.FileAccess.Read);
    }
    catch(IOException ex)
    {
        Response.Write(ex);
    }
}
werkt het perfect, ik krijg alleen een build error ("Use of unassigned local variable 'fs'", regel 3). Wat is er niet goed aan deze code?

Edit3: FileStream fs = null; does the trick...

[ Voor 72% gewijzigd door sig69 op 08-01-2004 12:28 ]

Roomba E5 te koop

Pagina: 1