Qt 数据库 结构体和image 数据类型 互转

有的时候我们要保存一个超大的数据 我们往往采用结构体的形式。但是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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值