ADO连接数据库Debug调试报:Run-Time Check Failure ADORun-Time Check FailureDebug 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 strcpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID")); strcpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name")); strcpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address")); strcpy 会导致溢出, 你调试看看这几个变量的值是否超出大小 bool Test(){ char szSql[64] = "select * from TEST"; int iRows = 0; char szError[512] = {0}; char szID[128] = {0}; char szName[128] = {0}; char szAddress[128] = {0}; try { _RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText); strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0; strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0; strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0 pRecord->Close(); } catch(_com_error e) { printf("%s\n", e.ErrorMessage()) exit(-1); } return true;} 谢谢回复,应该不是缓冲区过小导致问题的。我代码改成下面这样函数返回后报同样的错误。string strID = (char*)(_bstr_t)pRecord->GetCollect("ID");string strName = (char*)(_bstr_t)pRecord->GetCollect("Name");string strAddress = (char*)(_bstr_t)pRecord->GetCollect("Address"); 感谢回复,我按照老师说的,改成下面这样,函数返回后报同样的错误!char szID[128] = {0};strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);char szName[128] = {0};strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);char szAddress[128] = {0};strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127); 按照赵老师说的函数返回时还是报同样的错!bool Test(){ char szSql[64] = "select * from YF_TEST"; int iRows = 0; char szError[512] = {0}; char szID[128] = {0}; char szName[128] = {0}; char szAddress[128] = {0}; try { _RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText); strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0; strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0; strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0; pRecord->Close(); } catch(_com_error e) { printf("%s\n", e.ErrorMessage()); exit(-1); } return true;} char szID[128] = {0}; char szName[128] = {0}; char szAddress[128] = {0}; strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0; strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0; strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0;和char szID[128] = {0};strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);char szName[128] = {0};strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);char szAddress[128] = {0};strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127); strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);char szName[128] = {0};strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);char szAddress[128] = {0};strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127); 不是一回事! char szSql[64] = "select * from YF_TEST";改为char szSql[64] = "select * from YF_TEST where rownum<1000";//防止表YF_TEST万一有≥100万条记录试试看。 或者static char szSql[64] = "select * from YF_TEST"; int iRows = 0;static char szError[512] = {0};static char szID[128] = {0};static char szName[128] = {0};static char szAddress[128] = {0};在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 1.ADO在读取记录之前要先判断是否有记录,对空记录进行读取会报错的2.数据库_variant_t的NULL值是不能这样强制转换的可以看下这里的例子,C++熟悉的话推荐用ADO类方便一些。 这样是没用的,数据库里面只有一条测试数据。都改为静态变量后Debug没有报错了,但想不通是Test函数里定义的所有字符数组加起来不超过1024字节啊! 我感觉是下面两句有问题, char szSql[64] = "select * from TEST"; _RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText); 问题出现在(_bstr_t)szSql,由于szSql是char数据,而(_bstr_t)是宽字符。楼主可以把char szSql[64] = "select * from TEST";改在(_bstr_t)类型来式式,使用sysallocstring来创建一个(_bstr_t) 再次调试后发现是_RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);这句导致Debug调试问题的,估计和ADO里面的com类型有关,改为下面这样Debug就不报错了。哪位高人可以解释下原因。bool Test(){ char szSql[64] = "select * from YF_TEST"; int iRows = 0; char szError[512] = {0}; char szID[128] = {0}; char szName[128] = {0}; char szAddress[128] = {0}; _RecordsetPtr pRst(__uuidof(Recordset)); _CommandPtr pCmd(__uuidof(Command)); try { pCmd->put_ActiveConnection(_variant_t((IDispatch*)m_conPtr)); pCmd->CommandText=szSql; pRst=pCmd->Execute(NULL,NULL,adCmdText); strcpy(szID, (char*)(_bstr_t)pRst->GetCollect("ID")); strcpy(szName, (char*)(_bstr_t)pRst->GetCollect("Name")); strcpy(szAddress, (char*)(_bstr_t)pRst->GetCollect("Address")); pRst->Close(); } catch(_com_error e) { printf("%s\n", e.ErrorMessage()); exit(-1); } return true;} int iRows;m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);肯定是不能这样强制转换的,两个数据类型大小都不一致。 这就是问题所在,第二个参数填NULL或VARIANT指针类型后,Debug不再报错,感谢大家的耐心指教! 求禁用USB接口的代码 双缓冲画大尺寸图 请教!如何获得对话框中属性页的句柄! 怎么设置打印默认值?up有分 *.bmp位图的放大于缩小 ODynaset::GetRecordCount();? 问一个很早就想问的问题?大家知道C++之父Bjarne Stroustrup 咱么都! 严重求救,刚刚在VC上编程,碰到的一个编译的问题 急急急!!!!安装SP5的时候,电脑竟说没发现任何VS组件!!!!! 切换视图的问题!! OpenCV 窗口最小化后ClicntToScreen返回的坐标都是负值,请大侠们给解释一下
strcpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"));
strcpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address")); strcpy 会导致溢出, 你调试看看这几个变量的值是否超出大小
{
char szSql[64] = "select * from TEST";
int iRows = 0;
char szError[512] = {0};
char szID[128] = {0};
char szName[128] = {0};
char szAddress[128] = {0}; try
{
_RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0
pRecord->Close();
}
catch(_com_error e)
{
printf("%s\n", e.ErrorMessage())
exit(-1);
}
return true;
}
我代码改成下面这样函数返回后报同样的错误。string strID = (char*)(_bstr_t)pRecord->GetCollect("ID");
string strName = (char*)(_bstr_t)pRecord->GetCollect("Name");
string strAddress = (char*)(_bstr_t)pRecord->GetCollect("Address");
strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
char szName[128] = {0};
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
char szAddress[128] = {0};
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127);
{
char szSql[64] = "select * from YF_TEST";
int iRows = 0;
char szError[512] = {0};
char szID[128] = {0};
char szName[128] = {0};
char szAddress[128] = {0}; try
{
_RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0;
pRecord->Close(); }
catch(_com_error e)
{
printf("%s\n", e.ErrorMessage());
exit(-1);
} return true;
}
char szName[128] = {0};
char szAddress[128] = {0};
strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0;
和
char szID[128] = {0};
strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
char szName[128] = {0};
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
char szAddress[128] = {0};
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127); strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
char szName[128] = {0};
strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
char szAddress[128] = {0};
strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127);
不是一回事!
改为
char szSql[64] = "select * from YF_TEST where rownum<1000";//防止表YF_TEST万一有≥100万条记录
试试看。
static char szSql[64] = "select * from YF_TEST";
int iRows = 0;
static char szError[512] = {0};
static char szID[128] = {0};
static char szName[128] = {0};
static char szAddress[128] = {0};在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
2.数据库_variant_t的NULL值是不能这样强制转换的
可以看下这里的例子,C++熟悉的话推荐用ADO类方便一些。
都改为静态变量后Debug没有报错了,但想不通是Test函数里定义的所有字符数组加起来不超过1024字节啊!
char szSql[64] = "select * from TEST";
_RecordsetPtr pRecord = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
问题出现在(_bstr_t)szSql,由于szSql是char数据,而(_bstr_t)是宽字符。
楼主可以把char szSql[64] = "select * from TEST";改在(_bstr_t)类型来式式,使用sysallocstring来创建一个(_bstr_t)
{
char szSql[64] = "select * from YF_TEST";
int iRows = 0;
char szError[512] = {0};
char szID[128] = {0};
char szName[128] = {0};
char szAddress[128] = {0}; _RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command)); try
{
pCmd->put_ActiveConnection(_variant_t((IDispatch*)m_conPtr));
pCmd->CommandText=szSql;
pRst=pCmd->Execute(NULL,NULL,adCmdText); strcpy(szID, (char*)(_bstr_t)pRst->GetCollect("ID"));
strcpy(szName, (char*)(_bstr_t)pRst->GetCollect("Name"));
strcpy(szAddress, (char*)(_bstr_t)pRst->GetCollect("Address"));
pRst->Close(); }
catch(_com_error e)
{
printf("%s\n", e.ErrorMessage());
exit(-1);
} return true;
}
m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
肯定是不能这样强制转换的,两个数据类型大小都不一致。