Avatar billede jytte Nybegynder
31. maj 2004 - 18:30 Der er 30 kommentarer og
1 løsning

flytte fil fra database til mappe

Jeg har en fil liggende i et database-felt (bindata). Når jeg via enterprise manager kigger på feltet står den en masse tegn begyndende med 0x

Jeg vil gerne vha VB flytte filen fra databasen til en mappe.

Jeg troede jeg kunne kalde SaveFile(path,objRec("bindata"))

Sub SaveFile(filepath, str)
    Dim objFSO As Object
    Dim objNewFile As Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objNewFile = objFSO.CreateTextFile(filepath)
    objNewFile.WriteLine (str)
    objNewFile.Close
End Sub 'SaveFile

Men den giver nedenstående fejl ved
linien (objNeWFile.WriteLine(str)

Invalid procedure call or argument

--min fil er et word-dokument så måske hænger der sammen med at der ikke er tale om en text-file, men hvad gør jeg så ?
Avatar billede sjh Nybegynder
31. maj 2004 - 23:22 #1
Prøv sådan:

Call SaveFile(path,objRec("bindata"))

Public Sub SaveFile(ByVal strPath As String, ByVal strData As String)
Dim intFree As Integer
  intFree = FreeFile
  Open strPath For Binary Access Write As #intFree
    Put #intFree, 1, strData
  Close #intFree
End Sub
Avatar billede sjh Nybegynder
31. maj 2004 - 23:24 #2
eller strData skal nok være variant.

Public Sub SaveFile(ByVal strPath As String, ByVal strData As Variant)
....
Avatar billede jytte Nybegynder
01. juni 2004 - 12:57 #3
Din version af SaveFile virker for så vidt at jeg nu får en fil i min mappe, men den har ikke extension .doc og hvis jeg åbner den i word viser den bare nogle firkanter og et enkelt ord.
Ved du hvad der er galt ?
Avatar billede sjh Nybegynder
01. juni 2004 - 16:03 #4
prøv at bruge den sådan:

Call SaveFile(Path, StrConv(objRec("bindata"), vbUnicode))
Avatar billede jytte Nybegynder
01. juni 2004 - 20:04 #5
samme resultat pånær antallet af firkanter i filen uden extension

er du sikker på jeg skal bruge vbUnicode ?
Avatar billede sjh Nybegynder
01. juni 2004 - 20:18 #6
Ja ellers er det vbFromUnicode ellers prøv..
Avatar billede jytte Nybegynder
01. juni 2004 - 20:32 #7
det gør ikke den store forskel -- nogle af de underlige tegn ser bare lidt anderledes ud.

Men jeg kan heller ikke forstå hvordan det kan give mening at bruge StrConv på noget som ikke er en streng men en række bytes ?
Avatar billede sjh Nybegynder
01. juni 2004 - 20:39 #8
en lille test viser at det skulle være -> vbUnicode

Private Sub Form_Load()
Dim i As Long
Dim bytData() As Byte
Dim strData As String

bytData = StrConv("Test", vbFromUnicode)

For i = 0 To UBound(bytData)
  MsgBox "Byte: " & bytData(i)
Next

strData = StrConv(bytData, vbUnicode)
MsgBox "String: " & strData

End Sub
Avatar billede sjh Nybegynder
01. juni 2004 - 20:44 #9
men du kunne  jo prøve det sådan (Uden at køre det gennem ...Sub SaveFile(....)

Dim strPath As String
Dim intFree As Integer
Dim strData As String

  strPath = "C:\Savefile.doc"
  strData = StrConv(objRec("bindata"), vbUnicode)

  intFree = FreeFile
  Open strPath For Binary Access Write As #intFree
    Put #intFree, 1, strData
  Close #intFree
Avatar billede sjh Nybegynder
01. juni 2004 - 20:48 #10
men hvordan plejer du at få det ud? (hvis det er noget du har prøvet) ;)
Avatar billede sjh Nybegynder
01. juni 2004 - 20:49 #11
er det noget du har brugt via.. ASP?
Avatar billede jytte Nybegynder
01. juni 2004 - 21:07 #12
Jeg har lige fået filen til at få den rigtige extension (den gemmes nemlig også i databasen)
Men når jeg åbner wordfilen siger den
  Microsoft word can't import the specified format
  this feature is not currently installed. Would you like to install i now?
og hvis jeg vælger no vises et langt worddokument hovedsagelig bestående af firkanter

Det kan måske have noget at sige at jeg reelt ikke bruger objRec("bindata") direkte men først hælder resultatet af min select-sætning over i et array vha. getRows.
Avatar billede jytte Nybegynder
01. juni 2004 - 21:13 #13
de filer der ligger i databasen fås normalt ud vha. en komponent.
Jeg plejer at arbejde i ASP
Grunden til at jeg gerne vil pille filerne ud enkelt-vis er at jeg gerne vil kunne lave en mappestruktur med filerne som jeg kan zippe under et.
Avatar billede sjh Nybegynder
01. juni 2004 - 21:18 #14
det kunne jo være at den komponent du bruger laver en konversion af den data som bliver gemt i din database.. og at du ikke kan få du ud igen uden at bruge den.
Avatar billede sjh Nybegynder
01. juni 2004 - 21:27 #15
ellers prøv sådan:

Public Function ConvArrayToString(nArray As Variant) As String
Dim strResult As String
Dim i As Long
  For i = LBound(nArray) To UBound(nArray)
    strResult = (strResult & Chr(nArray(i)))
  Next i
ConvArrayToString = strResult
End Function

Ved snart ikke hvad man ellers kunne gøre :-)
Avatar billede jytte Nybegynder
01. juni 2004 - 21:41 #16
jeg mener ikke aspsmartupload konverterer filen.
Jeg har faktisk et script (som ikke benytter komponenten) som kan vise word-dokumenter fra databasen på en asp-side vha

Response.ContentType = contenttype'"application/ms-word"
Response.AddHeader "Content-Disposition", "attatchment; filename=" & """" & filename & """"
Response.BinaryWrite indhold
Avatar billede sjh Nybegynder
01. juni 2004 - 21:43 #17
Så brug det samme script som kan smide det i -> indhold
Avatar billede sjh Nybegynder
01. juni 2004 - 21:44 #18
hvis det virker i asp så plejer det også at virke i vb ;)
Avatar billede jytte Nybegynder
01. juni 2004 - 21:48 #19
StrConv skal have en streng som input og det er objRec("bindata") jo netop ikke -- så jeg tror ikke dit forslag med denne funktion overhovedet har nogen effekt i mit eksempel.
At prøve at lave andre konverteringer til string tror jeg derfor ikke på.
Avatar billede sjh Nybegynder
01. juni 2004 - 21:51 #20
(StrConv) se nu lige her:


Private Sub Form_Load()
Dim i As Long
Dim bytData() As Byte
Dim strData As String

bytData = StrConv("Test", vbFromUnicode)

For i = 0 To UBound(bytData)
  MsgBox "Byte: " & bytData(i)
Next

strData = StrConv(bytData, vbUnicode) '<------- Her er det byte der kommer ind ---------
MsgBox "String: " & strData

End Sub
Avatar billede jytte Nybegynder
01. juni 2004 - 21:52 #21
jeg kigger på det senere, foreløbig tak for hjælpen
Avatar billede jytte Nybegynder
04. juni 2004 - 00:29 #22
Dim bin As Byte
bin = objRec("bindata")

giver "Type mismatch" (og jeg henter ikke længere ud i et array først)
Avatar billede jytte Nybegynder
04. juni 2004 - 00:32 #23
feltet hvori bindata ligger har datatype image og min database er ms SQL server
Avatar billede sjh Nybegynder
04. juni 2004 - 01:25 #24
så prøv at lave bin til array

Dim bin() As Byte
bin = objRec("bindata")
Avatar billede sjh Nybegynder
04. juni 2004 - 01:28 #25
Du kunne også lige se hvad type det er:

MsgBox TypeName(objRec("bindata"))
Avatar billede jytte Nybegynder
04. juni 2004 - 10:32 #26
at gør bin til array gjorde ingen forskel

objRec("bindata") har typen:  Field
Avatar billede Slettet bruger
04. juni 2004 - 11:04 #27
Prøv med Variant
Dim bin() As Variant
Avatar billede jytte Nybegynder
04. juni 2004 - 15:02 #28
Nu ser det ud til at virke -- skønt jeg troede jeg tidligere havde prøvet denne kombination:

Dim intFree As Integer
intFree = FreeFile
Dim strPath As String
Dim strData As String
strPath = mypath
strData = StrConv(objRec("bindata"), vbUnicode)
Open strPath For Binary Access Write As #intFree
Put #intFree, 1, strData
Close #intFree
Avatar billede jytte Nybegynder
04. juni 2004 - 15:07 #29
Jeg siger mange mange tak for din hjælp sjh.

Jeg tror kernen i mit problem var at jeg tilsyneladende ikke måtte putte objRec("bindata") ind i en temporær variabel.

og til Bertie: selv med variant gav den "type mismatch"
Avatar billede Slettet bruger
04. juni 2004 - 17:52 #30
Jamen det var da godt at det lykkedes for dig, jeg har nemlig fulgt med for jeg har lidt samme situation så jeg vil da prøve om jeg kan bruge din løsning :-)
Avatar billede sjh Nybegynder
05. juni 2004 - 13:17 #31
Jytte der er den samme som den jeg skræv:

Kommentar: sjh
01/06-2004 20:44:01

  strPath = "C:\Savefile.doc"
  strData = StrConv(objRec("bindata"), vbUnicode)
  ...
  ....

Men du har måske ikke prøvet den :D

Tak for point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester