Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.07.2006, 23:44

[MySQL] BLOB Tables

Arbeite bei nem Projekt mit BLOB Tables... aber ich versteh im moment noch net ganz WIE man da bsw ne Bitmap rein bzw rausladen soll... wenn jemand gerade nen code snippet da hätte wäre klasse... sonnst guck ich, wenn ich mal Zeit hab selbst nochmal...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

2

13.07.2006, 12:56

Natürlich von C++ aus... hab meinen Wrapper geschrieben... die C-API ist ganauso anzusprechen wie die PHP ... nur damit das klar ist ;)

Hmm wenn keiner weiß wie das richtig geht, mach ich das evt sonnst so, das ich die Daten einfach Binär auslese und in ne Table schreib und dann beim auslesen einfach ne Temporäre Datei erstell... mal sehen ;)

Wenn jemand doch weiß wie es richtig geht... gebt bescheid!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

13.07.2006, 13:47

Ich habe ehrlich gesagt noch nie BLOBs benutzt (warum eigentlich nicht?), daher weiss ich auch nicht, ob es so geht, aber ich denke schon -- zumindest ansatzweise:

Pseudo-Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Bitmap bmp;
// [...]

// Buffer für komplette Bitmap reservieren

// und Daten in den Buffer kopieren.

char cData[ bmp.size ];
copy( cData, bmp.fullbuffer );
// Anzahl der Hochkommata (') und

// Null-Terminatoren zählen.

dword noEscapes = count_chars( cData, '\'', '\0' );
// Hochkommata und 0 durch Escape-Zeichen

// ersetzen und in neuem Buffer speichern.

char cData4MySQL[ bmp.size + noEscapes ];
replace_chars( cData4MySQL, cData, '\'', "\\'", '\0', "\\0" );
// SQL ausführen.

query( "INSERT INTO myTable (myBLOB) VALUES ('%s')", cData4MySQL );


Vielleicht müssen Null-Characters gar nicht entfernt werden, aber ich denke, es ist klar geworden, wie ich herangehen würde. Vielleicht reicht das ja als Denkanstoß? Selbst probiert habe ich es ja noch nicht... kann sein, dass es totaler Unsinn ist...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

13.07.2006, 14:17

Kurze Frage, wozu brauchst du das eigentlich?

Und so wie ich das sehe gibt es keine Möglichkeit um die temporäre Datei drumrum zu kommen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

13.07.2006, 15:57

k... ist nen MySQL Server(also nen Server auf dem nur MySQL ist usw) auf dem die Daten dann sind... sind dann ca 1000 CLients die die Daten abrufen.. d.h. werd ich die Images dann in ne BLOB Table Stecken... der ich mach das evt. noch anders... mal sehen... dann speicher ich die Pics einfach so auf dem Server und übertrag die per Serverapplication auf jeden PC wo die dann direkt bleiben... nicht nur temp.. mal sehen :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

14.07.2006, 01:04

Wäre eindeutig die bessere Idee. Dann könntest du in der Tabelle anstatt der eigentlichen Datei den Dateipfad speichern. Besonders wenn es mehr als 1000 Clients sein soll, sollte man auf die Datenmengen achten :) . Pack die schon geladenen Bilder dann doch in ein Archiv und verpass dem Teil ne Checksumme, um Änderungen leicht feststellen zu können.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

7

14.07.2006, 07:34

Zitat von »"Nox"«

Dann könntest du in der Tabelle anstatt der eigentlichen Datei den Dateipfad speichern.

Halte ich im allgemeinen für eine nicht so tolle Idee.
Die Dateipfade in der Datenbank mit den "echten" Dateipfaden synchron zu halten wird selbst bei wenigen Bildern schnell zu Arbeit ausarten, geschweigedenn, dass es fehlerfrei gemacht wird... hab das beim ersten mal auch so gemacht... nie wieder.

Außerdem, jetzt habe ich ein DB-System für die Datenverwaltung und dann liegen die Daten erst wieder wo anders rum.... naja irgendwie nicht ganz logisch find ich und ich glaube die heutigen SQL-Server sind schon in der Lage mit Dateien zu arbeiten.

PS:
Ich werde mich ab nächste Woche auch mit dem Thema SQL und Dateien beschäftigen, sollte ich eine Lösung finden, werd ich sie posten.

mfg Philipp

8

14.07.2006, 09:30

Phil_GDM
Na scheifgehen sollte da nix ;) Hab dem Enduser nen Admin Tool geschrieben mit der die DB verwaltet wird... also muss der selbst da nix machen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

9

28.07.2006, 09:10

So hat doch ein bisschen länger gedauert aber hier ist die Lösung (C#):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;

namespace SqlBlob
{
  public partial class Form1 : Form
  {

    private MySqlConnection connection_ = null;
    private Byte[] image_data_ = null;

    public Form1()
    {
      InitializeComponent();

      loadImage();

      openConnection();

      saveImageToDatabase();

      loadImageFromDatabase();
    }


    private void loadImage()
    {
      OpenFileDialog ofd = new OpenFileDialog();
      ofd.InitialDirectory = "c:\\";
      ofd.Filter = "Image Files(*.bmp;*.jpg;*.gif;*.png)|*.bmp;*.jpg;*.gif;*.png|All files (*.*)|*.*";
      ofd.RestoreDirectory = true;

      if(ofd.ShowDialog() == DialogResult.OK)
      {
        try
        {
          Bitmap bmp = new Bitmap(ofd.FileName);
          
          //also load a bytedata-copy

          FileStream stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
          image_data_ = new Byte[stream.Length];
          stream.Read(image_data_, 0, image_data_.Length);
          stream.Close();
        }
        catch(Exception)
        {
          MessageBox.Show("Diese Bilddatei konnte nicht geladen werden");
        }
      }
    }

    private void openConnection()
    {
      string connection = "SERVER=localhost;DATABASE=temp;UID=root;PASSWORD=xxx";
      connection_ = new MySqlConnection(connection);
      connection_.Open();
    }

    private void saveImageToDatabase()
    {
      MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(?picture)", connection_);
      MySqlParameter param = new MySqlParameter("?picture", MySqlDbType.Blob, 
        image_data_.Length, System.Data.ParameterDirection.Input, true, 0, 0, 
        null, DataRowVersion.Current, image_data_);
      cmd.Parameters.Add(param);
      cmd.ExecuteNonQuery();
    }

    private void loadImageFromDatabase()
    {
      Byte[] buffer = new Byte[24000];
      MySqlCommand cmd = new MySqlCommand("SELECT photo FROM test", connection_);
      try
      {
        MySqlDataReader rd = cmd.ExecuteReader();
        while(rd.Read())
        {
          int bytes_read = (int)rd.GetBytes(0, 0, buffer, 0, 24000);
          //Alternativ könnte man auch die Anzahl der Bytes in der Datenbank mit

          //speichern, um Puffer mit der richtigen Größe zu erzeugen

          MemoryStream stream = new MemoryStream(buffer, 0, bytes_read, false);
          Bitmap bmp = new Bitmap(stream);
          pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
          pictureBox1.Image = bmp;
        }
      }
      catch(Exception exc)
      {
        MessageBox.Show(exc.Message);
      }
    }
  }
}

mfg Philipp

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

10

28.07.2006, 11:44

Das ganze Using da oben treibt einem ja mal sonstwas hoch. Ich werd nie verstehen warum Menschen so leichtfertig mit dem Feuer spielen ...

Werbeanzeige