Load Image From Db Problem



  • Hi
    I have saved a pic to my Sql Server Db
    but When i want To load it in my Graphic View
    DO nothing :|
    this is my code:
    .h file

            QPixmap originalPixmap;
            QPixmap outPixmap;
            QByteArray inByteArraye;
            QByteArray outByteArray;
    

    .cpp file

        readSkeletonPicQry.exec("SELECT SskeletonPic FROM Patient_File WHERE SmeliCode='"+seMcode+"'");
        outByteArray = readSkeletonPicQry.value(0).toByteArray();
        outPixmap = QPixmap();
        outPixmap.loadFromData(outByteArray,"PNG");
        scene->addPixmap(outPixmap);
        ui->graphicsView_2->setScene(scene)
    

    my datatype in sql server Table in IMAGE and its store pics Fine
    but i cant Show pic in graphic View From Table
    *My Table Pic
    whats Wrong?


  • Qt Champions 2016

    @M4RZB4Ni said:

    well ,start with looking at some return codes.

    qDebug() << "exec:" << readSkeletonPicQry.exec(xx)
    qDebug() << "outByteArray :" << outByteArray.size();

    is seMcode a string?



  • @mrjj
    ok i will do it
    yes seMcode is String and for other data selection like username and etc Worked



  • @mrjj
    exec: Unable to execute statement: "[Microsoft][ODBC Driver Manager] Function sequence error"
    false
    outByteArray : 0
    what i should do?


  • Qt Champions 2016

    @M4RZB4Ni said:

    loadFromData

    also check return from that :)



  • @mrjj
    its seems Query is not Execute Properly



  • Any Body Cant Help me?


  • Qt Champions 2016

    @M4RZB4Ni
    Hi
    Its impossible to guess why
    "SELECT SskeletonPic FROM Patient_File WHERE SmeliCode='"+seMcode+"'"
    is not correct.
    Could be non existing seMcode
    Anyway, you MUST use correct error handling to have a fighting chance
    so please add error checking.

    as in

    QSqlQuery query;
    query.exec(QString("select NAME from PEOPLE where AGE=%1").arg(age));
    if (query.next())
    {
    qDebug() << "query ok:";
    } else {
        qDebug() << "SqLite error:" << query.lastError().text() << ", error code:" << query.lastError().number();
    }
    


  • @mrjj
    no!
    seMcode is true because i can select more data with it !
    i think problem is converting from table(IMAGE DATATYPE) TO byte array !
    and i write your qdebug code and says query ok!


  • Qt Champions 2016

    @M4RZB4Ni
    well check return code from loadFromData to know if it fails.
    and the size of QBytearray



  • @mrjj
    According to qDebug Report

    outByteArray : 8
    QODBCResult::exec: Unable to execute statement: "[Microsoft][ODBC Driver Manager] Function sequence error"
    false
    

    Byte array size is 8


  • Qt Champions 2016

    Ok so it seems it dont like your BLOB
    8 is not much for image so I wonder
    if it saved more than 8 and just the reading that failed.

    Anyway, its seems not to be Qt related as such so you should find out what
    ODBC + "Function sequence error" means.

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/86fc9d29-99ee-416e-891f-2451c4f09f4d/microsoftodbc-driver-manager-function-sequence-error-in-64bit-windows-2008-server?forum=sqldataaccess

    but there are many others.



  • @M4RZB4Ni said in Load Image From Db Problem:

    i think problem is converting from table(IMAGE DATATYPE) TO byte array !

    are you using image as field type in your database? if so you shouldn't, it's deprecated and will be removed (see https://msdn.microsoft.com/en-us/library/ms187993.aspx). use varbinary(max) instead.

    Also, you should use QImage instead of QPixmap.

    Qt provides four classes for handling image data: QImage, QPixmap, QBitmap and QPicture. QImage is designed and optimized for I/O, and for direct pixel access and manipulation, while QPixmap is designed and optimized for showing images on screen. QBitmap is only a convenience class that inherits QPixmap, ensuring a depth of 1. Finally, the QPicture class is a paint device that records and replays QPainter commands.



  • @VRonin
    yes i use IMAGE because when i use VABBINARY(MAX) when i want save image
    program show error
    "Cant Convert varchar datatype to VARBINARY(MAX)!
    and i should Use IMAGE datatype!



  • How do you save it?

    You should definitely use VARBINARY:

    From Microsoft, page linked above:

    IMPORTANT! ntext, text, and image data types will be removed in a future version of SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.



  • @M4RZB4Ni
    this is all of my codes:
    see it and if you can correct it
    .h file:

    QImage *pix;
            QImage originalPixmap;
            QPixmap outPixmap;
            QPixmap pxp;
            QGraphicsPixmapItem pixItem;
            QByteArray inByteArraye;
            QByteArray outByteArray;
    

    .cpp file:

    void Medical_Records::shootScreen()
    {
        QScreen *screen = QGuiApplication::primaryScreen();
        if (const QWindow *window = windowHandle())
            screen = window->screen();
        if (!screen)
            return;
    
      originalPixmap=ui->graphicsView_2->grab().toImage();
        updateGraphicView();
    
    }
    void Medical_Records::initalizeVarables()
    {
             shootScreen();
            QBuffer inBuffer( &inByteArraye );
            inBuffer.open(QIODevice::WriteOnly);
            originalPixmap.save(&inBuffer,"PNG");
    }
    
    
    void Medical_Records::readSkeletonPic()
    {
        moveToThread(readSkeletonPicThread);
      readSkeletonPicQry.exec("SELECT SskeletonPic FROM Patient_File WHERE SmeliCode='"+seMcode+"'");
        readSkeletonPicQry.next();
        outByteArray = readSkeletonPicQry.value(0).toByteArray();
        //outPixmap = QPixmap();
        originalPixmap.loadFromData(outByteArray,"PNG");
        qDebug() << "outByteArray :" << outByteArray.size();
        qDebug() << "outByteArray :" << originalPixmap.size();
        outPixmap.fromImage(originalPixmap.fromData(outByteArray,"PNG"));
        scene->addPixmap(outPixmap);
        ui->graphicsView_2->setScene(scene);
        qDebug() << readSkeletonPicQry.exec();
        readSkeletonPicThread->start();
    }
    


  • i don't get the threading thing but it's probably not the point here. where did you get the
    "Cant Convert varchar datatype to VARBINARY(MAX)" error?



  • @VRonin
    when i want insert image into database after capture screenshot



  • Can you post that code please?



  • @VRonin
    yes of course
    thanks so much

    this is code :

    void Medical_Records::initalizeVarables()
    {
    
            shootScreen();
            QBuffer inBuffer( &inByteArraye );
            inBuffer.open(QIODevice::WriteOnly);
            originalPixmap.save(&inBuffer,"PNG");
    }
    void Medical_Records::submitWithScreenShot()
    {
    
      initalizeVarables();
        QSqlQuery sql;
        sql.exec("UPDATE Patient_File SET SskeletonPic='"+inByteArraye+"' WHERE SmeliCode='"+seMcode+"';");
    }
    


  • yep, you should check QSqlQuery::bindValue

    sql.prepare("UPDATE Patient_File SET SskeletonPic= :skp  WHERE SmeliCode= :smc");
    sql.bindValue(":skp",inByteArraye);
    sql.bindValue(":smc",seMcode);
    sql.exec();
    

    this also prevents SQL Injection. You should never really use unescaped input directly to build the query string



  • @VRonin
    thanks but my problem is in Load image not save it!
    Thank a lot My Friend :)



  • make the field varbinary(max), save it that way and the code you have will work, no changes needed on the load part

    image in SQL server is a fixed length string. it has nothing to do with images



  • Hi!
    The same problem, you could solve?
    Thanks



  • @Kutyus

    Summary of the above:

    • in the database use the type VABBINARY not IMAGE
    • use QSqlQuery::bindValue instead of string concatenation to build your query


  • @VRonin Thank you for reply, but my problem is the load image from database, please see my another question:
    QT 5.8 image from database error


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.