2009-07-10 6 views
1

Ich weiß, dies wurde zuvor gefragt, und ich habe versucht, die Lösung zu implementieren, aber ich bekomme Ausnahmefehler, wenn ich ps-> ExecuteUpdate() aufrufen. Hat jemand ein explizites Beispiel?Wie setze ich Binärdaten mit setBlob() in C++ - Connector

+0

"und ich habe versucht, die Lösung zu implementieren" Wie sollen wir wissen, was Sie versucht haben, wenn Sie keinen Code posten? Es würde auch helfen zu wissen, welche Tutorials/Beispiele du verwendest. –

Antwort

0

Sorry Matthew - Ich nahm die vorherige Antwort auf diese Frage (von Elrohin). Vielleicht hätte ich darauf antworten sollen. Wie dem auch sei heres den Code, schlug er vor:

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 

Ich verwende VS9 mit den neuesten (beta) Anschluss/cav Debug-Libs. Ich habe auch versucht, Char * anstelle von String zu verwenden.

+0

Wenn eine Ausnahme in free.c ausgelöst wird, bedeutet das, dass mit dem Speicher schlimme Dinge passiert sind. Ich schaue gerade auf diesen Char Cast. – Puppy

0

Dieser Code funktioniert gut für mich:


    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(); 

hoffe, es hilft ... Jaroslav Pribyl

0

Dieser Beitrag ist ein bisschen alt, aber ich über die gleiche Frage lief. Ich habe die obige Methode angewendet und es hat nicht ganz richtig für meinen Fall funktioniert, der versuchte, einen Vektor zu nehmen und diesen für den Stream zu verwenden. Was ich tat, war, eine UUID zu nehmen und sie in eine 16-Byte-Binärversion umzuwandeln, um sie in der Tabelle zu verwenden. Mit der obigen Methode habe ich festgestellt, dass nur die Hälfte meines Puffers gefüllt wurde.

Ich endete mit einem 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); 

Ein paar andere Dinge zu beachten. Auf den Stream wird erst zugegriffen, wenn eine der execute-Varianten aufgerufen wird. Sie müssen also den Stream so lange halten, bis Sie execute ausgeführt haben.

Hoffentlich hilft dies jemandem und spart ihnen Zeit.

Verwandte Themen