Load Image From Db Problem
-
@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(); }
-
@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!@M4RZB4Ni
well check return code from loadFromData to know if it fails.
and the size of QBytearray -
@M4RZB4Ni
well check return code from loadFromData to know if it fails.
and the size of QBytearray -
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.but there are many others.
-
@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!wrote on 25 Aug 2016, 12:12 last edited by@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). usevarbinary(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.
-
@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). usevarbinary(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.
-
wrote on 25 Aug 2016, 12:55 last edited by VRonin
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.
-
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 fileQPixmap 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?wrote on 25 Aug 2016, 13:13 last edited by M4RZB4Ni@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(); }
-
wrote on 25 Aug 2016, 13:20 last edited by
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? -
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? -
wrote on 25 Aug 2016, 13:59 last edited by
Can you post that code please?
-
wrote on 25 Aug 2016, 14:07 last edited by
@VRonin
yes of course
thanks so muchthis 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+"';"); }
-
wrote on 25 Aug 2016, 16:49 last edited by VRonin
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
-
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
-
wrote on 25 Aug 2016, 16:58 last edited by VRonin
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
-
wrote on 21 Jun 2017, 14:48 last edited by
Hi!
The same problem, you could solve?
Thanks -
Summary of the above:
- in the database use the type
VABBINARY
notIMAGE
- use QSqlQuery::bindValue instead of string concatenation to build your query
wrote on 22 Jun 2017, 06:00 last edited by@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 - in the database use the type