2009-07-10 5 views
1

Je sais que cela a déjà été demandé, et j'ai essayé d'implémenter la solution, mais j'ai juste des erreurs d'exception quand j'appelle ps-> executeUpdate(). Quelqu'un at-il un exemple explicite?Comment définir les données binaires en utilisant setBlob() dans le connecteur C++

+0

"et j'ai essayé de mettre en œuvre la solution" Comment sommes-nous censés savoir ce que vous avez essayé si vous ne postez aucun code? Il serait également utile de savoir quels tutoriels/exemples vous utilisez. –

Répondre

0

Désolé Matthew - J'ai supposé la réponse précédente à cette question (par elrohin). Peut-être que j'aurais dû répondre à cela. Quoi qu'il en soit Heres le code il a suggéré:

class DataBuf : public streambuf 
{ 
public: 
    DataBuf(char * d, size_t s) { 
     setg(d, d, d + s); 
    } 
}; 


// prepare sql update statement etc. and set the data pointer 
string* pData = ; // ...not part of the original answer 

DataBuf buffer((char*)pData->data(), pData->length()); 
istream stream(&buffer); 
ps->setBlob(1, &stream); 
ps->executeUpdate(); // This causes an exception in free.c 

J'utilise VS9 avec le connecteur/cpp libs de débogage (dernières beta). J'ai aussi essayé d'utiliser char * au lieu de string.

+0

Si une exception est générée dans free.c, cela signifie que de mauvaises choses se sont produites avec la mémoire. Je regarde directement cette fonte. – Puppy

0

Ce code fonctionne bien pour moi:


    Driver *driver; 
    Connection *conn; 

    driver = get_driver_instance(); 
    conn = driver->connect("tcp://127.0.0.1:3306", "root", "root"); 

    std::auto_ptr use_stmt(conn->createStatement()); 
    use_stmt->execute("USE world"); 

    std::auto_ptr stmt(conn->prepareStatement("INSERT INTO terrain_texture_tiles_0 (data) VALUES(?)")); 
    std::string value("A\0B", sizeof("A\0B") - 1); 
    std::istringstream tmp_blob(value); 
    stmt->setBlob(1, &tmp_blob); 
    stmt->execute(); 

espère que cela aide ... Jaroslav Pribyl

0

Ce poste est un peu vieux, mais je suis tombé sur la même question. J'ai employé la méthode ci-dessus et cela n'a pas vraiment fonctionné pour mon cas, qui essayait de prendre un vecteur et de l'utiliser pour le flux. Ce que je faisais était de prendre un UUID et de le convertir en une version binaire de 16 octets à utiliser dans la table. En utilisant la méthode ci-dessus, j'ai trouvé que seulement la moitié de mon tampon était peuplé. J'ai fini par utiliser stringstream.

std::vector<unsigned char> convertedId; 
std::stringstream   stream; 

// convertedId has been populated with the 16 byte binary version 
stream = std::stringstream(std::string(convertedId.begin(), convertedId.end())); 
// Parameter 1 is BINARY(16) 
pStatement->setBlob(1, &stream); 

Quelques autres choses à garder à l'esprit. Le flux n'est pas accessible jusqu'à ce que l'une des variantes execute soit appelée. Vous devrez donc garder le flux jusqu'à ce que vous ayez exécuté execute.

Espérons que cela aidera quelqu'un et lui fera gagner du temps.

Questions connexes