VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 915|回复: 8

[求助] 数据库班

[复制链接]
08_avatar_middle
online_vip 发表于 2017-4-12 10:27:16 | 显示全部楼层 |阅读模式
SYc老大,我在照着班里写如下代码时发生问题。然后运行课程带的程序也发生了此问题:
BOOL CRentDVDDlg::RentDVDByRecordset(CString& strDVDID, CString& strRentName, CString& strRentDate)
{
        BOOL bRet = FALSE;
        _RecordsetPtr pRentRecordset;
        pRentRecordset.CreateInstance(__uuidof(Recordset));
        try {
                HRESULT hr = pRentRecordset->Open(
                        _T("select * from tbRentInfo"),
                        m_pConnection.GetInterfacePtr(),
                        adOpenDynamic,
                        adLockOptimistic,
                        adCmdText);

                if(SUCCEEDED(hr))
                {
                        pRentRecordset->AddNew();
                        pRentRecordset->PutCollect("sDVDID",_variant_t(strDVDID));
                        pRentRecordset->PutCollect("sName",_variant_t(strRentName));
                        pRentRecordset->PutCollect("sDate",_variant_t(strRentDate));
                        pRentRecordset->Update();
                        bRet = TRUE;
                }
        } catch(_com_error *e) {
                MessageBox(e->ErrorMessage());
        }  

        pRentRecordset->Close();
        pRentRecordset = NULL;
        return bRet;
}

以下几句代码发生了问题,显示:PutCollect()类型不匹配,程序其它的功能都没问题。我把这几句注释掉就不报错了。我使用的是WIN764位+vs2010.难道是ado库中的函数有变化?
                        pRentRecordset->AddNew();
                        pRentRecordset->PutCollect("sDVDID",_variant_t(strDVDID));
                        pRentRecordset->PutCollect("sName",_variant_t(strRentName));
                        pRentRecordset->PutCollect("sDate",_variant_t(strRentDate));
                        pRentRecordset->Update();




上一篇:请问怎么写遍历C盘路径下搜索某个文件夹某个文件并且运行呢
下一篇:dib位图像素点问题
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-12 10:41:50 | 显示全部楼层
单步调试运行的话,一到: pRentRecordset->Update();这句就报错。类型不匹配。
04_avatar_middle
online_vip 发表于 2017-4-12 10:51:32 | 显示全部楼层
本帖最后由 xiao14116 于 2017-4-12 10:52 编辑

看下数据库的数据类型和你代码中的数据类型是不是一致,估计是那个sDate的数据类型不是字符串类型
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-12 12:30:24 | 显示全部楼层
xiao14116 发表于 2017-4-12 10:51
看下数据库的数据类型和你代码中的数据类型是不是一致,估计是那个sDate的数据类型不是字符串类型

create table tbRentInfo(
        sID int identity (1,1) primary key not null,
        sDVDID int not null,
        sName varchar(20) not null,
        sDate datetime not null,
        foreign key (sDVDID) references tbDVDInfo(sDVDID)
        );
这个表是这样创建的,sData的类型是datatime
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-12 12:32:11 | 显示全部楼层
看SYC老师的视频程序运行时没有问题的。拿到我这里就不行了,奇了怪了
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-12 13:49:57 | 显示全部楼层
把这几句注释掉程序也运行没问题!
pRentRecordset->AddNew();
                        pRentRecordset->PutCollect("sDVDID",_variant_t(strDVDID));
                        pRentRecordset->PutCollect("sName",_variant_t(strRentName));
                        pRentRecordset->PutCollect("sDate",_variant_t(strRentDate));
                        pRentRecordset->Update();

难道就我一个人遇到么?数据库班
04_avatar_middle
online_vip 发表于 2017-4-13 09:01:59 | 显示全部楼层
创建表的时候把sDate datetime not null,
这句改成  sDate varchar(20) not null,
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-13 14:46:41 | 显示全部楼层
xiao14116 发表于 2017-4-13 09:01
创建表的时候把sDate datetime not null,
这句改成  sDate varchar(20) not null,

问题已经解决了,就是字段类型和更改数据类型不匹配:
SYC老师是这样实现的:
BOOL CRentDVDDlg::RentDVDByCommand(CString& strDVDID, CString& strRentName, CString& strRentDate)
{
        BOOL bRet = FALSE;
        _CommandPtr pCommand;
        pCommand.CreateInstance(__uuidof(Command));
        pCommand->ActiveConnection = m_pConnection;

        CString strSQL;
        strSQL.Format(_T("insert into tbRentInfo(sDVDID,sName,sDate) values(\'%s\',\'%s\',\'%s\')"), strDVDID, strRentName, strRentDate);
        pCommand->CommandText =_bstr_t(strSQL);

        try {
                HRESULT hr = pCommand->Execute(NULL, NULL, adCmdText);
                if(SUCCEEDED(hr)){
                        bRet = TRUE;
                }

        }catch(_com_error *e) {
                MessageBox(e->ErrorMessage());
        }

        return bRet;
}

我要进行这样修改之后才可以运行成功:
BOOL CRentDVDDlg::RentDVDByCommand(CString& strDVDID, CString& strRentName, CString& strRentDate)
{
        BOOL bRet = FALSE;
        _CommandPtr pCommand;
        pCommand.CreateInstance(__uuidof(Command));
        pCommand->ActiveConnection = m_pConnection;
        //*********修改部分***************
        int nDVDID = _ttoi(strDVDID);
        int nRentDate = _ttoi(strRentDate);
   //*********修改部分***************
        CString strSQL;                                                   //*********修改部分***************
        strSQL.Format(_T("insert into tbRentInfo(sDVDID,sName,sDate) values(\'%d\',\'%s\',\'%d\')"), nDVDID, strRentName, nRentDate);
        pCommand->CommandText =_bstr_t(strSQL);                           //*********修改部分***************

        try {
                HRESULT hr = pCommand->Execute(NULL, NULL, adCmdText);
                if(SUCCEEDED(hr)){
                        bRet = TRUE;
                }

        }catch(_com_error *e) {
                MessageBox(e->ErrorMessage());
        }

        return bRet;
}

我和SYC老师建的表是一样的,字段的数据类型也一样,很奇怪也很好奇SYC老师怎么运行就没有问题了?
非常感谢你的耐心解答啊
08_avatar_middle
ico_lz  楼主| 发表于 2017-4-14 14:57:08 | 显示全部楼层
问题已经解决!运行SYC老师的代码没有问题了!
错误原因是电脑上的时间显示格式的问题,导致datetime字段的时间值总是显示:  2017/04/14 星期五   -------这种格式。
更改电脑的时间设置:控制面板----区域和时间   进行短日期和长日期格式的设定,设置好后,datetime字段就不显示星期五了!
时间显示不同,数据库datetime字段就可能插入不进去了!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2019-9-22 14:59

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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