有的时候我们要保存一个超大的数据 我们往往采用结构体的形式。但是SqlServer中只有image的数据结构类型 以二进制的形式保存下来。
这是我们便要讲结构体的内容转为image的二进制格式
结构体样式
typedef struct{
DataPacket CurrentDataPacket; //基本信息
ChVSAmpsAndPhs ChFFtAmpAndPhs[32]; //频谱数据
}CurrentDataPackectAndFFTData;
typedef struct {
float Rpm1; //转速1
float Rpm2; //转速2
float Rpm3; //转速3
float Rpm4; //转速4
float PK2PK[32]; //峰峰值32通道
}DataPacket;
往数据库中插入数据
bool ServerObj::insertHour(QString acqId, QString acqName, CurrentDataPackectAndFFTData dataPaket, int projectId)
{
QSqlQuery query(DB);
QDateTime dataTime=QDateTime::currentDateTime();
QString insertTime=dataTime.toString("yyyy/MM/dd hh:mm:ss"); //插入时间
QByteArray ba;
ba.resize(sizeof(CurrentDataPackectAndFFTData)); //结构体的大小
memcpy(ba.data(),&dataPaket,sizeof(CurrentDataPackectAndFFTData)); //数据复制
//sqlserver 语句样式
query.prepare("insert into T_B_ACQ_Hour Values(:d1,:d2,:d3,:d4,:d5)");
query.bindValue(":d1", acqId);
query.bindValue(":d2", acqName);
query.bindValue(":d3", ba, QSql::Binary);
query.bindValue(":d4", insertTime);
query.bindValue(":d5", projectId);
bool flag=query.exec();
if(!flag){
qDebug()<<query.lastError().text() << query.lastQuery();
}
return flag;
}
同理当你要从数据库中找到 image 数据类型转 结构体
前提image已知结构体的样式 才能保持长度一致
QList<CurrentDataPackectAndFFTData> ServerObj::getPacketByBlackBox()
{
QList<CurrentDataPackectAndFFTData> listPacket;
QSqlQuery query(DB);
QString sql=QString("select * FROM dbo.T_B_ACQ_BlackBox_ACQ"); //语句
query.exec(sql);
while (query.next())
{
QByteArray data = query.value("dataPaket").toByteArray();
CurrentDataPackectAndFFTData datas;
memcpy(&datas, data.data(), sizeof(CurrentDataPackectAndFFTData));
listPacket.append(datas);
}
return listPacket;
}