• 6809阅读
  • 29回复

QT连数据库处理大对象?急急急!!!! [复制链接]

上一主题 下一主题
离线lippan
 
只看楼主 倒序阅读 楼主  发表于: 2013-01-11
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-01-16) —
求各位大神赐教。。。求思路。。求解决方法。。。。已经连上数据库了。。。就是不知道怎么通过QT存储大对象到数据库
离线realfan

只看该作者 1楼 发表于: 2013-01-11
将大对象数据入到QByteArray,再用bindValue绑定就行了
离线lippan
只看该作者 2楼 发表于: 2013-01-11
压缩解压后没有得到数据。。。
QByteArray &tdata=File.readAll();
  QByteArray data=qCompress(tdata,9);
  QString storefile="insert into files(id,filename,filecontent) values(11,'FileName',data);";
  /*query.bindValue(":filename",FileName);
  query.bindValue(":filecontent",data);*/
  query.exec(storefile);
这是压缩。。。
  QSqlQuery query(db);
query.prepare("select filecontent from files;");
query.exec();

query.next();
QByteArray tdata=query.value(0).toByteArray();
QByteArray data=qUncompress(tdata);
QFile File("Fileme");
File.close();  
/*QMessageBox::information(this,"OK5!","success!");*/
if(File.open(QIODevice::WriteOnly))
{
  File.write(data);
  QMessageBox::information(this,"OK4!","success!");
  File.close();
}这是解压后写进文件。。。。就是只有一个空文件。。写不进去。。。不知道哪里出错了
离线lippan
只看该作者 3楼 发表于: 2013-01-11
回 1楼(realfan) 的帖子
有具体步骤么。。。我不是太会。。。下面有我的程序。。帮忙看看
离线realfan

只看该作者 4楼 发表于: 2013-01-11
回 2楼(lippan) 的帖子
你先一步步跟踪一下,看QByteArray 中的内容是不是一直有。
数据插数据库中有没有成功?

我从来没有直接用sql语句中的变量,在记录集中写过二进制数据块。都是用绑定的方式
QString storefile = "INSERT INTO files (id, filename, filecontent) VALUES (:id, :filename, :filecontent)";
query.prepare(storefile);
query.bindValue(id, 11);
query.bindValue(filename, "FileName");
query.bindValue(filecontent, data);
query.exec();
离线realfan

只看该作者 5楼 发表于: 2013-01-11
回 2楼(lippan) 的帖子
query.prepare("select filecontent from files;");
这里要分号吗
离线justwake

只看该作者 6楼 发表于: 2013-01-12
回 5楼(realfan) 的帖子
NO!
离线lippan
只看该作者 7楼 发表于: 2013-01-12
回 4楼(realfan) 的帖子
那个filecontent对应的是   <<二进制数据
数据库的表里面是这么表示的也不知道存不存在
query.prepare("select filecontent from files;");
query.exec();

query.next();
QByteArray tdata=query.value(0).toByteArray();
QByteArray data=qUncompress(tdata);
QFile File("Fileme");
File.close();  
/*QMessageBox::information(this,"OK5!","success!");*/
if(File.open(QIODevice::WriteOnly))
{
  File.write(data);
  QMessageBox::information(this,"OK4!","success!");
  File.close();

还有那个写回文件的时候不知道写法对不对。。。得到的那个文件是个空的好像没写进去。。能加个联系方式么。。。
离线realfan

只看该作者 8楼 发表于: 2013-01-12
回 7楼(lippan) 的帖子
query.prepare("select filecontent from files;");
这句里面不要加分号
File.write(data);之前,检查一下data.size()
离线lippan
只看该作者 9楼 发表于: 2013-01-14
回 8楼(realfan) 的帖子
刚检查到写之前的数据大小为0,这是个什么情况,难道没查询到自己压缩的内容?
离线realfan

只看该作者 10楼 发表于: 2013-01-14
回 9楼(lippan) 的帖子
哪一步size为0?
QByteArray &tdata=File.readAll(); 这步
  QByteArray data=qCompress(tdata,9); 还是这步

将这句
QByteArray &tdata=File.readAll();改成
QByteArray  tdata=File.readAll();
离线lippan
只看该作者 11楼 发表于: 2013-01-14
query.prepare("select filecontent from files");
    query.exec();
    query.next();
    QString title=query.value(0).toString();
    QMessageBox::information(this,"OK!",qPrintable(title));这里有值
    QByteArray tdata=query.value(0).toByteArray();
    QMessageBox::information(this,"OK421!",qPrintable(QString::number(tdata.size()) ));这里也有值
    QByteArray data=qUncompress(tdata);
    QMessageBox::information(this,"OK421!",qPrintable(QString::number(data.size()) ));这里就是0了
离线lippan
只看该作者 12楼 发表于: 2013-01-14
回 10楼(realfan) 的帖子
就是在写的时候(先读进数据库嘛。。然后查找到文件解压写出来)
query.prepare("select filecontent from files");
    query.exec();
    query.next();
    QString title=query.value(0).toString();
    QMessageBox::information(this,"OK!",qPrintable(title));这里有值
    QByteArray tdata=query.value(0).toByteArray();
    QMessageBox::information(this,"OK1!",qPrintable(QString::number(tdata.size()) ));这里也有值
    QByteArray data=qUncompress(tdata);
    QMessageBox::information(this,"OK2!",qPrintable(QString::number(data.size()) ));这里就是0了
离线lippan
只看该作者 13楼 发表于: 2013-01-14
回 10楼(realfan) 的帖子
我参照的是这个网址
http://www.3gtarena.com/danapeixunjishu/qianrushipeixun/960.html你可以看一下
离线lippan
只看该作者 14楼 发表于: 2013-01-14
回 10楼(realfan) 的帖子
在开始压缩的时候都有值。。。就是后面查询解压的时候就没有值了。。。
离线realfan

只看该作者 15楼 发表于: 2013-01-14

根据你提供的地址的代码,我修改了一下,并测试通过。你参考一下吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53


    //----------------------------------------------------
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("C:/Qt/mydb.db");
    if (!db.open())
    {
        qDebug() << " can’t open database >>>>>> mydb.db";
        exit(-1);
    }

    //----------------------------------------------
    QStringList tableList = db.tables();
    QSqlQuery query(db);
    if(!tableList.contains("files"))
    {
        QString createTable = "create table files (id integer primary key,"
                              "filename varchar(128) unique, filecontent blob)";
        if(!query.exec(createTable))
        {
            qDebug() << query.lastError();
            exit(-1);
        }
    }
    //-----------------------------------------------
    QString strFileName = "C:/Qt/1.bmp";
    QFile file(strFileName);
    if(file.open(QIODevice::ReadOnly))
    {
        QByteArray tdata = file.readAll();
        QByteArray data = qCompress(tdata, 9);
        query.clear();
        query.prepare("INSERT INTO files (id,filename,filecontent)"
                      "VALUES(NULL,:filename,:filecontent)");
        query.bindValue(":filename", strFileName);
        query.bindValue(":filecontent", data);
        if(!query.exec())
        {
            qDebug() << query.lastError();
            return ;
        }
    }
    //--------------------------------------------
    query.clear();
    query.prepare("select filecontent from files");
    query.exec();
    query.next();
    QByteArray tdata = query.value(0).toByteArray();
    QByteArray data = qUncompress(tdata);
    QFile File("C:/Qt/out.bmp");
    if(File.open(QIODevice::WriteOnly))
    {
        File.write(data);
        File.close();
    }
离线realfan

只看该作者 16楼 发表于: 2013-01-14
回 14楼(lippan) 的帖子
读取一个文件,压缩,存到数据表,读出来,解压,写成文件。
我用了一个bmp文件试过了,可以的。
离线lippan
只看该作者 17楼 发表于: 2013-01-14
我解压时data的大小为0
query.clear();
    query.prepare("select filecontent from files");
    query.exec();
    query.next();
    QByteArray tdata = query.value(0).toByteArray();这里还有值
    QByteArray data = qUncompress(tdata);这里变为0了
离线lippan
只看该作者 18楼 发表于: 2013-01-14
回 16楼(realfan) 的帖子
我解压时data的大小为0
query.clear();
    query.prepare("select filecontent from files");
    query.exec();
    query.next();
    QByteArray tdata = query.value(0).toByteArray();这里还有值
    QByteArray data = qUncompress(tdata);这里变为0了
离线realfan

只看该作者 19楼 发表于: 2013-01-14
测试 testdb.zip (3 K) 下载次数:3

附件是我测试的工程,你试一下吧,qt4.8.4下测试ok运行前,先在c盘根目录建个qt目录,里面放个1.bmp文件,运行后,会创建一个out.bmp
离线lippan
只看该作者 20楼 发表于: 2013-01-14
回 19楼(realfan) 的帖子
我现在的问题是压缩和解压放在一起能运行
QByteArray data = qCompress(tdata, 9);
QByteArray data1 = qUncompress(data);
这样能解压

当从数据库提取出来之后就不能解压了
QByteArray tdata = query.value(0).toByteArray();这里还有值
    QByteArray data = qUncompress(tdata);这里变为0了
这样不能解压了。。。问题是不是出在toByteArray();?
离线realfan

只看该作者 21楼 发表于: 2013-01-14
回 20楼(lippan) 的帖子
你跑一下我给你的附件,看行不行
离线lippan
只看该作者 22楼 发表于: 2013-01-14
我的跟你的没什么区别。。。我估计是编码出问题了
离线lippan
只看该作者 23楼 发表于: 2013-01-14
回 19楼(realfan) 的帖子

QByteArray tdata = query.value(0).toByteArray();这里的值和以前的值不一样了。。。变大了
就是取出来的和存入数据库的相比变大了
离线realfan

只看该作者 24楼 发表于: 2013-01-14
回 23楼(lippan) 的帖子
你用什么编译器?
你编译一下我附上的工程,正常吗
离线lippan
只看该作者 25楼 发表于: 2013-01-14
我的数据库不一样。。编你的太麻烦了。。。刚改了下还没建出表了。。。我总结了一下就是 解压单独跟压缩放一起没问题 。。。从数据库里提取出来转换格式后。。比之前放进去的压缩包变大了。。然后就不能解压了。。。
离线realfan

只看该作者 26楼 发表于: 2013-01-14
回 25楼(lippan) 的帖子
我的工程,用Qt Creator打开,就可以编译运行了,这都闲麻烦。
离线lippan
只看该作者 27楼 发表于: 2013-01-14
回 26楼(realfan) 的帖子
没有qt-creater   。。。。你的程序好多地方要改。。。大体上我也能看懂。。。和我的没有本质的区别。。。。要不我的给你运行一下。。。你又没有postgreSQL数据库。。。不过可以下个。。。现在我的问题找的就是那个数据变大的问题了。。。不知道怎么解决。。。
离线lippan
只看该作者 28楼 发表于: 2013-01-15
现在问题是能压缩。。。。并存储。。。但 从数据库里提取出来的数据好像是压缩后的两倍。。。导致不能解压了。。。。
离线realfan

只看该作者 29楼 发表于: 2013-01-15
回 28楼(lippan) 的帖子
我建议你先把压缩解压的代码注释掉,直接读文件,写库,再读库,写文件,看看正不正常
快速回复
限100 字节
 
上一个 下一个