Gibt es irgendwo einen Link oder Hilfe die das mit dem "?" erklärt???
Interessiert mich doch sehr!  Ich hätte vermutet dort müsste die Speicheradresse hin...
			
			
									
									Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
Win10/64|Ubuntu-Server|Mint WS // Programmiere Datenbankanwendungen und Tools mit PB-5.x und MySQL-5.x unter Win und Linux
						Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
und ich hätte vermutet das pb das bei richtiger Anwendung von alleine macht
http://www.purebasic.fr/english/viewtop ... tabaseblob
--------
ist ja logisch das ein mit ' unzingelter wert auch korrekt in die datenbank eingetragen wird
das ok hat mich auch auf die falsche Fährte geführt
ist wohl doch eher der ODBC-Treiber der hier querhaut. ich habs mal mit MySQL durchgekaut und da wuppt es
also doch ADO ?? Kiffi fragen
			
			
									
									http://www.purebasic.fr/english/viewtop ... tabaseblob
--------
ist ja logisch das ein mit ' unzingelter wert auch korrekt in die datenbank eingetragen wird
das ok hat mich auch auf die falsche Fährte geführt
ist wohl doch eher der ODBC-Treiber der hier querhaut. ich habs mal mit MySQL durchgekaut und da wuppt es
also doch ADO ?? Kiffi fragen
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
						Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
@Lupo: södele, hier der Code:
ich habe mich an Deine Tabellenstruktur gehalten, so dass Du lediglich nur noch
den COMate-Includepfad und die Zugangsdaten zum SQL Server anpassen musst.
Falls noch Klärungsbedarf ist, dann weißt Du ja, wo ich bin
Grüße ... Kiffi
// EDIT
29.01.2010: Speicherleck behoben
			
			
													Code: Alles auswählen
IncludePath #PB_Compiler_Home + "srod\comateplus\" 
IncludeFile "comateplus.pbi"
EnableExplicit
#adTypeBinary          = 1
#adOpenKeyset          = 1
#adLockOptimistic      = 3
#adSaveCreateOverWrite = 2
Procedure WriteImageToDatabase(ConnectionString.s, Foto_Nummer, Foto_Image.s)
  
  Protected ADODB_Connection.COMateObject  ; Connection-Object
  Protected ADODB_Recordset.COMateObject   ; Recordset-Object
  Protected ADODB_Stream.COMateObject      ; Stream-Object
  Protected *varStreamRead.VARIANT
  
  If FileSize(Foto_Image) < 0
    Debug "File not found: '" + Foto_Image + "'"
    ProcedureReturn
  EndIf
  
  ADODB_Connection = COMate_CreateObject("ADODB.Connection")
  
  If ADODB_Connection 
    
    If ADODB_Connection\Invoke("Open('" + ConnectionString + "')") = #S_OK
      
      ADODB_Stream = COMate_CreateObject("ADODB.Stream")
      
      If ADODB_Stream
        
        ADODB_Stream\SetProperty("Type=" + Str(#adTypeBinary))
        ADODB_Stream\Invoke("Open")
        ADODB_Stream\Invoke("LoadFromFile('" + ReplaceString(Foto_Image, "'", "$0027") + "')")
        
        ADODB_Recordset = COMate_CreateObject("ADODB.Recordset")
        
        If ADODB_Recordset
          
          If ADODB_Recordset\Invoke("Open('SELECT Foto_Nummer, Foto_Image FROM gamepics Where 1=2', " + Str(ADODB_Connection) + " As COMateObject, " + Str(#adOpenKeyset) + ", " + Str(#adLockOptimistic) + ")") = #S_OK
            
            ADODB_Recordset\Invoke("AddNew")
            
            ADODB_Recordset\SetProperty("Fields('Foto_Nummer')\Value=" + Str(Foto_Nummer))
            
            *varStreamRead = ADODB_Stream\GetVariantProperty("Read")
            
            ADODB_Recordset\SetProperty("Fields('Foto_Image')\Value="  + Str(*varStreamRead) + " As Variant")
            
            VariantClear_(*varStreamRead)
            
            ADODB_Recordset\Invoke("Update")
            ADODB_Recordset\Invoke("Close")
            
          Else
            Debug "!ADODB_Recordset.Open(): " + COMate_GetLastErrorDescription()
          EndIf
          
          ADODB_Recordset\Release()
          
        Else
          Debug "!ADODB_Recordset: " + COMate_GetLastErrorDescription()
        EndIf
        
        ADODB_Stream\Invoke("Close")
        ADODB_Stream\Release()
        
      Else
        Debug "!ADODB_Stream: " + COMate_GetLastErrorDescription()
      EndIf
      
      ADODB_Connection\Invoke("Close")
      
    Else
      Debug "!ADODB_Connection.Open(): " + COMate_GetLastErrorDescription()
    EndIf
    
    ADODB_Connection\Release()
    
  Else
    Debug "!ADODB_Connection: " + COMate_GetLastErrorDescription()
  EndIf
  
EndProcedure
Procedure ReadImageFromDatabase(ConnectionString.s, Foto_Nummer, Foto_Image.s)
  
  Protected ADODB_Connection.COMateObject  ; Connection-Objekt
  Protected ADODB_Recordset.COMateObject   ; Recordset-Object
  Protected ADODB_Stream.COMateObject      ; Stream-Object
  Protected *varStreamRead.VARIANT
  
  ADODB_Connection = COMate_CreateObject("ADODB.Connection")
  
  If ADODB_Connection 
    
    If ADODB_Connection\Invoke("Open('" + ConnectionString + "')") = #S_OK
      
      ADODB_Stream = COMate_CreateObject("ADODB.Stream")
      
      If ADODB_Stream
        
        ADODB_Stream\SetProperty("Type=" + Str(#adTypeBinary))
        ADODB_Stream\Invoke("Open")
        
        ADODB_Recordset = COMate_CreateObject("ADODB.Recordset")
        
        If ADODB_Recordset
          
          If ADODB_Recordset\Invoke("Open('SELECT Foto_Nummer, Foto_Image FROM gamepics Where Foto_Nummer=" + Str(Foto_Nummer) + "', " + Str(ADODB_Connection) + " As COMateObject, " + Str(#adOpenKeyset) + ", " + Str(#adLockOptimistic) + ")") = #S_OK
            
            *varStreamRead = ADODB_Recordset\GetVariantProperty("Fields('Foto_Image')\Value")
            
            ADODB_Stream\Invoke("Write(" + Str(*varStreamRead) + " As Variant)" )
            
            VariantClear_(*varStreamRead)
            
            ADODB_Stream\Invoke("SaveToFile('" + ReplaceString(Foto_Image, "'", "$0027") + "', " + Str(#adSaveCreateOverWrite) + ")")
            
            ADODB_Recordset\Invoke("Close")
            
          Else
            Debug "!ADODB_Recordset.Open(): " + COMate_GetLastErrorDescription()
          EndIf
          
          ADODB_Recordset\Release()
          
        Else
          Debug "!ADODB_Recordset: " + COMate_GetLastErrorDescription()
        EndIf
        
        ADODB_Stream\Invoke("Close")
        ADODB_Stream\Release()
        
      Else
        Debug "!ADODB_Stream: " + COMate_GetLastErrorDescription()
      EndIf
      
      ADODB_Connection\Invoke("Close")
      
    Else
      Debug "!ADODB_Connection.Open(): " + COMate_GetLastErrorDescription()
    EndIf
    
    ADODB_Connection\Release()
    
  Else
    Debug "!ADODB_Connection: " + COMate_GetLastErrorDescription()
  EndIf
  
EndProcedure
Define.s SqlServer, SqlServerDatabase, SqlServerUsername, SqlServerPassword
Define.s ConnectionString
SqlServer         = "mySqlServer"
SqlServerDatabase = "mySqlServerDatabase"
SqlServerUsername = "myUsername" ; SQL Server-Authentification
SqlServerPassword = "myPassword" ; SQL Server-Authentification
  
; Windows-Authentification:
ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=" + SqlServerDatabase + ";Data Source=" + SqlServer
  
; SQL Server-Authentification:
; ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;Password=" + SqlServerPassword + ";User ID=" + SqlServerUsername + ";Initial Catalog=" + SqlServerDatabase + ";Data Source=" + SqlServer
WriteImageToDatabase (ConnectionString, 2, "C:\MyInImage.png")
ReadImageFromDatabase(ConnectionString, 2, "C:\MyOutImage.png")
Debug "Ready"den COMate-Includepfad und die Zugangsdaten zum SQL Server anpassen musst.
Falls noch Klärungsbedarf ist, dann weißt Du ja, wo ich bin
Grüße ... Kiffi
// EDIT
29.01.2010: Speicherleck behoben
					Zuletzt geändert von Kiffi am 29.01.2010 13:43, insgesamt 1-mal geändert.
									
			
									a²+b²=mc²
						Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
Wahnsinn! Es funktioniert! Danke! 
  
 
Kiffi ist Spitze
  
 
Dank auch an den comate Autor, ist ganz schön kompliziert.
Jetzt werde ich noch versuchen den code auch zu begreifen, abschreiben ist einfach aber zu wenig.
Wenn ich mehrere Fotos auf einmal einstellen möchte, dann kann man eine Schleife mit machen, damit man die Connection nicht immer neu aufmachen muss? 
Ist es sinnvoll, die Connection am Anfang des Programms zu öffnen und wenn man beendet zu schliessen? oder ist es besser nicht länger offen zu lassen und jedes mal zu schließen, könnte ja wer auch weggehen vom aktiven Programm und eine Stunde passiert nichts.
Dann will ich fragen, ob man die ADO Connection auch für die normalen PB Database Befehle nutzen kann, etwa dass man ein DNS=MYSUPERPICS in den Connectionstring einbaut und dann mit der DNS das Opendatabase() verwendet.
Wenn man das nicht kann, kann man dann beide connections (ADo unn PB) gleichzeitig öffnen oder passiert da was Böses?
 
Ich frage deshalb bevor ich da rumprobiere weil es ja eine fremde Datenbank ist und wenn der admin dort merkt, dass da gepfuscht wird, ist mir das nicht recht.
Nachdem ich schon viele DB Abfragen mit der Database() Lib geschrieben habe, möchte ich das nicht unbedingt mit Comate + ADO machen. Die echte Fotodatenbank ist natürlich komplizierter mit vielen Spalten als die Testfotodatenbank mit den 2 Spalten.
Danke Lupo
			
			
									
									
						Kiffi ist Spitze
Dank auch an den comate Autor, ist ganz schön kompliziert.
Jetzt werde ich noch versuchen den code auch zu begreifen, abschreiben ist einfach aber zu wenig.
Wenn ich mehrere Fotos auf einmal einstellen möchte, dann kann man eine Schleife mit
Code: Alles auswählen
ADODB_Stream = COMate_CreateObject("ADODB.Stream")Ist es sinnvoll, die Connection am Anfang des Programms zu öffnen und wenn man beendet zu schliessen? oder ist es besser nicht länger offen zu lassen und jedes mal zu schließen, könnte ja wer auch weggehen vom aktiven Programm und eine Stunde passiert nichts.
Dann will ich fragen, ob man die ADO Connection auch für die normalen PB Database Befehle nutzen kann, etwa dass man ein DNS=MYSUPERPICS in den Connectionstring einbaut und dann mit der DNS das Opendatabase() verwendet.
Wenn man das nicht kann, kann man dann beide connections (ADo unn PB) gleichzeitig öffnen oder passiert da was Böses?
Ich frage deshalb bevor ich da rumprobiere weil es ja eine fremde Datenbank ist und wenn der admin dort merkt, dass da gepfuscht wird, ist mir das nicht recht.
Nachdem ich schon viele DB Abfragen mit der Database() Lib geschrieben habe, möchte ich das nicht unbedingt mit Comate + ADO machen. Die echte Fotodatenbank ist natürlich komplizierter mit vielen Spalten als die Testfotodatenbank mit den 2 Spalten.
Danke Lupo
Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
Mein Code hat noch ein Speicherleck. Wenn man viele Bilder in die 
Datenbank schaufelt, steigt der Speicherverbrauch ständig an.
(danke @Lupo für den Hinweis)
Anscheinend gibt COMate (oder PureBasic?) den Speicher bei Variants
nicht automatisch frei. Ich habe den Source mal ein wenig abgeändert
und siehe da: Das Speicherleck ist weck, äh, weg
Folgende Zeile:
muss durch folgenden Schnippsel ersetzt werden:
*varStreamRead wird wie folgt im Procedure-Kopf deklariert:
Grüße ... Kiffi
			
			
									
									Datenbank schaufelt, steigt der Speicherverbrauch ständig an.
(danke @Lupo für den Hinweis)
Anscheinend gibt COMate (oder PureBasic?) den Speicher bei Variants
nicht automatisch frei. Ich habe den Source mal ein wenig abgeändert
und siehe da: Das Speicherleck ist weck, äh, weg
Folgende Zeile:
Code: Alles auswählen
ADODB_Recordset\SetProperty("Fields('Foto_Image')\Value="  + Str(ADODB_Stream\GetVariantProperty("Read")) + " As Variant")Code: Alles auswählen
*varStreamRead = ADODB_Stream\GetVariantProperty("Read")
ADODB_Recordset\SetProperty("Fields('Foto_Image')\Value="  + Str(*varStreamRead) + " As Variant")
VariantClear_(*varStreamRead)Code: Alles auswählen
[...]
Protected *varStreamRead.VARIANT
[...]a²+b²=mc²
						Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
Danke an Kiffi  
 für das Beseitigen des Speicherlecks.
Werde mal rumprobieren wie das zustandekommt, weil im Comate wird ganz normal mit AllocateMemory der Speicher reserviert und man kann ihn später auch mit Freememory wieder freigeben aber er ist nicht wirklich freigegeben
			
			
									
									
						Werde mal rumprobieren wie das zustandekommt, weil im Comate wird ganz normal mit AllocateMemory der Speicher reserviert und man kann ihn später auch mit Freememory wieder freigeben aber er ist nicht wirklich freigegeben
- ts-soft
 - Beiträge: 22292
 - Registriert: 08.09.2004 00:57
 - Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
 
Re: Wie bring ich Fotoimages in eine SQL Server 2005 Datenbank ?
siehe hier: http://www.purebasic.fr/german/viewtopi ... 01#p264701Lupo hat geschrieben:Danke an Kiffifür das Beseitigen des Speicherlecks.
Werde mal rumprobieren wie das zustandekommt, weil im Comate wird ganz normal mit AllocateMemory der Speicher reserviert und man kann ihn später auch mit Freememory wieder freigeben aber er ist nicht wirklich freigegeben