my_mysql_real_escape_string / BLOB / JPEG



  • Hallo,

    ich bin am verzweifeln.

    Möchte ein JPG in einem BLOB speichern, das klappt auch so weit.
    Problem ist nur wenn ich das Feld wieder auslese und in eine Datei schreibe kann man das Bild zwar ansehen, es ist aber verkleinert. Die Datei selbst ist auch 198KB wie das Orginal 198KB, ist zwar ein netter Effekt aber nicht gewünscht.

    Hoffe hier kann mir wer helfen, hier noch ein Auszug meiner MySQL Klasse:

    Methode zum schreiben von BLOB

    bool TMySQL::SQLFillBlob(int id, String tableName, String spaltenName, String data, int maxallowd)
    {
       while (data.Length() > 0)
       {
          String line = data.SubString(1,maxallowd);
          data.Delete(1,maxallowd);
    
          char* from = new char[line.Length()+1];
          char* to = new char[line.Length()*2];
          if(!from || !to){
             if(!from){delete[] from;}
             if(!to){delete[] to;}
             return false;
          }
          strcpy(from, line.c_str());
          unsigned long ret = my_mysql_real_escape_string((MYSQL*)m_mysql, to, from, line.Length());
          line = String(to, ret);
    
          if (doExecSQL("UPDATE " + tableName + " SET " + spaltenName + " = CONCAT(" + spaltenName + ",'" + line + "') WHERE id = " + IntToStr(id),true) != 1)
          {
             if(!from){delete[] from;}
             if(!to){delete[] to;}
             return false;
          }
          if(!from){delete[] from;}
          if(!to){delete[] to;}
       }
       return true;
    }
    

    Methode doExecSQL

    int TMySQL::doExecSQL(String sql, BOOL ignoreerror)
    {
       int tries=0;
       int erg=0;
       int err=0;
       m_lasterror=0;
    
       if (!m_mysql) return 0;
       if (!m_connected) return 0;
       if (!checkq(sql)) return 0;
    
       while (tries++<5)
       {
          EnterCriticalSection(&m_criticalquery);
          try
          {
             if (my_mysql_real_query((MYSQL*)m_mysql,sql.c_str(),sql.Length())==0)
             {
                erg=(int)my_mysql_affected_rows((MYSQL*)m_mysql);
                tries=100;
             }
             else
             {
                err=my_mysql_errno((MYSQL*)m_mysql);
                if (!ignoreerror) WriteTrace("mysql.debug.log","MYSQL Error: "+IntToStr(tries)+" "+IntToStr(err)+" "+sql+"\r\n");
                if ((err==2013) || (err==2011))
                {
                   Sleep(500);
                   my_mysql_ping((MYSQL*)m_mysql);
                }
                else
                {
                   tries=100;
                   if (err)
                   {
                      ClearLastError();
                      char* fehlertext=(char*)my_mysql_error((MYSQL*)m_mysql);
                      if (fehlertext)
                      {
                         m_lasterrorstr=new char[strlen(fehlertext)+1];
                         strcpy(m_lasterrorstr,fehlertext);
                         if (!ignoreerror) WriteTrace("mysql.debug.log","MYSQL ErrorString: "+String(m_lasterrorstr)+"\r\n");
                      }
                   }
                }
             }
          } catch(Exception &exception) {WriteTrace("mysql.debug.log","TMySQLResult::ExecSQL: "+exception.Message+" "+sql+"\r\n");}
          LeaveCriticalSection(&m_criticalquery);
       }
       if (!erg) m_lasterror=err;
    
       return erg;
    }
    

    Danke im Voraus!!!!



  • Hab nun nen neuen Ansatz, Problem liegt scheinbar
    bei mysql_real_escape_string(),
    habe nun die Methode SQLFillBlob überarbeitet, JPG werden nun sauber gespeichert, PDF geht aber nicht!!!!!

    Da hab ich z.B. plötzlich für "09 08 10 00" "FF FF FF FF"

    bool TMySQL::SQLFillBlob(int id, String tableName, String spaltenName, String data, int maxallowd)
    {
       while (data.Length() > 0)
       {
          String line = data.SubString(1,maxallowd);
          data.Delete(1,maxallowd);
    
          char* to = new const char[line.Length()*3];
          if(!to){
             if(!to){delete[] to;}
             return false;
          }
          unsigned int ret = my_mysql_real_escape_string((MYSQL*)m_mysql, to, line.c_str(), line.Length());
          line = String(to, ret);
    
          if (doExecSQL("UPDATE " + tableName + " SET " + spaltenName + " = CONCAT(" + spaltenName + ",'" + line + "') WHERE id = " + IntToStr(id),true) != 1)
          {
             if(!to){delete[] to;}
             return false;
          }
          if(!to){delete[] to;}
       }
       return true;
    }
    

Anmelden zum Antworten