VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1146|回复: 8

[求助] VC++存储图片到数据库的问题

[复制链接]
71_avatar_middle
在线会员 发表于 2017-2-12 10:17:49 | 显示全部楼层 |阅读模式
3驿站币
各位大侠好,我最近测试做一个将图片存储到数据库的程序,遇到点问题,如下是代码:
void CTestpicterDlg::OnButton1()
{
        // TODO: Add your control notification handler code here
        char  szFilter[] = "JPG Files (*.jpg)|*.jpg|JPEG Files (*.jpeg)|*.jpeg|GIF Files (*.gif)|*.gif|BMP Files (*.bmp)|*.bmp||";
        CFileDialog dlg(TRUE,"jpg|gif",NULL,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
        if(dlg.DoModal() == IDOK)
        {
                CString strPathName = dlg.GetPathName();
                CPicter picter;               
                if(LoadJPGFile(strPathName))
                {
                        CDC *dc;
                        dc=GetDlgItem(IDC_DRAW2)->GetDC();
                        CRect rect;
                        GetDlgItem(IDC_DRAW2)->GetClientRect(&rect);
                        DrawImage(0, 0, rect.Width(),rect.Height(),dc);
                        dc->DeleteDC();
                        if(picter.IsOpen())
                                picter.Close();
                        picter.Open(CRecordset::snapshot,NULL,CRecordset::none);
                        picter.AddNew();
                        picter.m_id="01";
                        picter.m_picter.m_dwDataLength=m_nFileLen;
                        HGLOBAL hGlobal= GlobalAlloc(GPTR,m_nFileLen);//申请存放图像数据的空间。
                        picter.m_picter.m_hData = GlobalLock(hGlobal);//将该空间付给m_hData成员;
                        file.ReadHuge(picter.m_picter.m_hData,m_nFileLen);//读图像数据。
                        picter.SetFieldDirty(&picter.m_picter);//标志数据库已经修改;
                        picter.SetFieldNull(&picter.m_picter,FALSE);//设置记录为NULL;       
                        picter.Update();
                        picter.Close();
                        GlobalUnlock(hGlobal);
                        file.Close();                       
                }
                else
                {
                        MessageBox("cuowu");
                        file.Close();
                        picter.Close();
                }
        }
       
}

其中:LoadJPGFile(strPathName)是将选择的图片加载到内存中,file是公共的CFile类对象,CPicter是CRecordSet的派生类,已经关联好数据库,m_picter是CPicter的一个CLongBinary类参数。DrawImage(0, 0, rect.Width(),rect.Height(),dc)是将图片显示到控件里。
问题:图片能正常加载显示,编译是没有错误,运行时发生错误,如照片。断点编译时发现是picter.Open(CRecordset::snapshot,NULL,CRecordset::none);错误,求解!!!!!!

错误画面

错误画面




上一篇:求教 ip算dword
下一篇:求助向网口打印机发送打印数据C++例子
71_avatar_middle
ico_lz  楼主| 发表于 2017-2-13 14:36:05 | 显示全部楼层
没人回复么????
51_avatar_middle
online_admins 发表于 2017-2-13 15:16:53 | 显示全部楼层
一般情况下不建议直接把图片的数据存储到数据库中,图片还是存到硬盘上,可以把图片的路径存到数据库中!
71_avatar_middle
ico_lz  楼主| 发表于 2017-2-13 16:55:15 | 显示全部楼层
Syc 发表于 2017-2-13 15:16
一般情况下不建议直接把图片的数据存储到数据库中,图片还是存到硬盘上,可以把图片的路径存到数据库中!

这个我也知道,但是就想尝试一下,你看我的问题出在哪里?
51_avatar_middle
online_admins 发表于 2017-2-13 18:16:14 | 显示全部楼层
zzw843 发表于 2017-2-13 16:55
这个我也知道,但是就想尝试一下,你看我的问题出在哪里?

光用眼睛看的话不太好发现问题
最好把工程代码清理下传上来吧,我看看是什么问题
71_avatar_middle
ico_lz  楼主| 发表于 2017-2-14 09:28:46 | 显示全部楼层
Syc 发表于 2017-2-13 18:16
光用眼睛看的话不太好发现问题
最好把工程代码清理下传上来吧,我看看是什么问题

代码已上传,请帮忙看看

testpicter.zip

91.94 KB, 下载次数: 2

代码

51_avatar_middle
online_admins 发表于 2017-2-14 10:00:16 | 显示全部楼层
zzw843 发表于 2017-2-14 09:28
代码已上传,请帮忙看看

1、我这里没有 vc6 的开发环境,版本太高了,编译直接报错
2、没有数据库的支持。

这样吧,既然是数据操作报的错,就直接对数据库操作部分的代码加上 try-catch
另外,CPicter 是如何跟数据库关联的?应该还是数据库操作的问题
71_avatar_middle
ico_lz  楼主| 发表于 2017-2-14 11:13:52 | 显示全部楼层
Syc 发表于 2017-2-14 10:00
1、我这里没有 vc6 的开发环境,版本太高了,编译直接报错
2、没有数据库的支持。

CPicter是CRecordSet的派生类,通过新增类的方式系统自动创建的
  1. // Picter.cpp : implementation file
  2. //

  3. #include "stdafx.h"
  4. #include "testpicter.h"
  5. #include "Picter.h"

  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif

  11. /////////////////////////////////////////////////////////////////////////////
  12. // CPicter

  13. IMPLEMENT_DYNAMIC(CPicter, CRecordset)

  14. CPicter::CPicter(CDatabase* pdb)
  15.         : CRecordset(pdb)
  16. {
  17.         //{{AFX_FIELD_INIT(CPicter)
  18.         m_id = _T("");
  19.         m_nFields = 2;
  20.         //}}AFX_FIELD_INIT
  21.         m_nDefaultType = snapshot;
  22. }


  23. CString CPicter::GetDefaultConnect()
  24. {
  25.         return _T("ODBC;DSN=测试图片");
  26. }

  27. CString CPicter::GetDefaultSQL()
  28. {
  29.         return _T("[table1]");
  30. }

  31. void CPicter::DoFieldExchange(CFieldExchange* pFX)
  32. {
  33.         //{{AFX_FIELD_MAP(CPicter)
  34.         pFX->SetFieldType(CFieldExchange::outputColumn);
  35.         RFX_LongBinary (pFX, _T("[picter]"), m_picter);
  36.         RFX_Text(pFX, _T("[id]"), m_id);
  37.         //}}AFX_FIELD_MAP
  38. }

  39. /////////////////////////////////////////////////////////////////////////////
  40. // CPicter diagnostics

  41. #ifdef _DEBUG
  42. void CPicter::AssertValid() const
  43. {
  44.         CRecordset::AssertValid();
  45. }

  46. void CPicter::Dump(CDumpContext& dc) const
  47. {
  48.         CRecordset::Dump(dc);
  49. }
  50. #endif //_DEBUG
复制代码
71_avatar_middle
ico_lz  楼主| 发表于 2017-2-14 11:30:48 | 显示全部楼层
Syc 发表于 2017-2-14 10:00
1、我这里没有 vc6 的开发环境,版本太高了,编译直接报错
2、没有数据库的支持。

好像是数据库打开方法不对,CPicter类中有一个CLongBinary成员变量,是不是用Open(CRecordset::snapshot,NULL,CRecordset::none)方法不对??
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-23 22:01

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表