ADO连接数据库Debug调试报:Run-Time Check Failure,该如何解决
ADO连接数据库Debug调试报:Run-Time Check Failure
ADO方式连接Oracle数据库,Test函数执行return后崩溃,debug调试时报以下错误:
Run-Time Check Failure #2 - Stack around the variable 'szSql' was corrupted.
但是在release下运行正常,请问这是怎么回事,哪里出问题了?
付报错截图:

------解决思路----------------------
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 会导致溢出, 你调试看看这几个变量的值是否超出大小
------解决思路----------------------
------解决思路----------------------
单步调试一下,看你具体出错的位置。
------解决思路----------------------
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);
不是一回事!
------解决思路----------------------
------解决思路----------------------
或者
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类方便一些。
------解决思路----------------------
应该说到点子上了。
慎用强制类型转换。
------解决思路----------------------
我感觉是下面两句有问题,
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)
------解决思路----------------------
int iRows;
m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
肯定是不能这样强制转换的,两个数据类型大小都不一致。
ADO方式连接Oracle数据库,Test函数执行return后崩溃,debug调试时报以下错误:
Run-Time Check Failure #2 - Stack around the variable 'szSql' was corrupted.
但是在release下运行正常,请问这是怎么回事,哪里出问题了?
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);
strcpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"));
strcpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"));
strcpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"));
pRecord->Close();
}
catch(_com_error e)
{
printf("%s\n", e.ErrorMessage())
exit(-1);
}
return true;
}
付报错截图:
------解决思路----------------------
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;
}
------解决思路----------------------
单步调试一下,看你具体出错的位置。
------解决思路----------------------
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类方便一些。
------解决思路----------------------
应该说到点子上了。
慎用强制类型转换。
------解决思路----------------------
我感觉是下面两句有问题,
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)
------解决思路----------------------
int iRows;
m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
肯定是不能这样强制转换的,两个数据类型大小都不一致。