ADO 执行 插入 出错

voyagerbu 2008-06-04 11:09:04
VC++程序中执行
pConn->Execute(vSQL,&vRowsAffected,adCmdText);
时出错。
其中vSQL是"INSERT INTO ......"

跟踪调试发现:程序中调用了inline _RecordsetPrt Connection15:: Execute(_bstr_t CommandText, ...)函数中的
HRESULT _hr= raw_Execute(CommandText,RecordsAffected,Options,&_result);

运行时报错:“Access violation reading location 0x00000000”

我发现,_bstr_t类型的CommandText变量中含有成员m_wstr和m_str,其中m_wstr中有字符串数据,m_str则显示 <Bad Prt> 0x000000。不知道错误是不是和这里有关?

有一个明显的现象:pConn->Execute(vSQL,&vRowsAffected,adCmdText)在程序运行时是会多次调用的,第一次调用这段程序时一般不会出错,第二次调用这段程序就发生以上错误了。
另外,这段程序结束的时候做了 pConn->Close()。

还发现一个现象:出错的时候,其实数据已经insert到表里了,可是却报错了;而且_hr没有显示错误的种类,不能catch到错误。

有时会显示“不正确的变量类型”,这时可以catch到错误,这时程序不会退出。
顺便请问一下,SQLServer里的字段是varchar类型的,VC的字符串类似于“123abcdef”(即可能是数字开头的)。从VC insert到数据库表中时,怎样才能和数据库中varchar类型匹配?从而避免出现“不正确的变量类型”的异常?

请指教啊~~
...全文
226 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
voyagerbu 2008-06-11
  • 打赏
  • 举报
回复
_ConnectionPtr pConn;

pConn.CreateInstance(__uuidof(Connection));
pConn->ConnectionTimeout=20;
pConn->Open("Data Source=wxdb","sa","",adConnectUnspecified);
shakaqrj 2008-06-11
  • 打赏
  • 举报
回复
试试看其他的语句
插入语句
删除语句
等等
shakaqrj 2008-06-10
  • 打赏
  • 举报
回复
然后呢?
voyagerbu 2008-06-10
  • 打赏
  • 举报
回复
我的connection没有特别设置

::CoInitialize(NULL);

_ConnectionPtr pConn;
voyagerbu 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shakaqrj 的回复:]
按照道理应该不会如此的
因为我用的时候没有问题
你把你的sql放在数据库中执行看看
[/Quote]

可能其它异常也是由发生这些“不正确的变量类型”的异常引起的,现在不会出错了。

在数据库里执行“INSERT INTO....”的结果正确,并出现“1行 被上次查询影响”的对话框。

不知道为什么RowsAffected改成NULL就行了?

shakaqrj 2008-06-06
  • 打赏
  • 举报
回复
按照道理应该不会如此的
因为我用的时候没有问题
你把你的sql放在数据库中执行看看
shakaqrj 2008-06-06
  • 打赏
  • 举报
回复
...
我也不知道
因为我的没错
感觉是不是哪里connection设置了什么- -|||
cacar2008 2008-06-05
  • 打赏
  • 举报
回复
vRowsAffected
voyagerbu 2008-06-05
  • 打赏
  • 举报
回复

char sCurrentOrderName[333]="TestInstanceName1";
char vSQL[333];
sprintf(vSQL,"INSERT INTO db_procedure_reg (Prod_id,Prod_name,Parent_id) VALUES('%s','%s',%d)",sCurrentOrderName,sCurrentOrderName,nTask_id);
VARIANT vRowsAffected;
pConn->Execute(vSQL,&vRowsAffected,adCmdText);

抛出异常“不正确的变量类型”,但数据已经insert到了数据库表中。
数据库表中,Prod_id是varchar型,Prod_name是varchar型,Parent_id是bigint型。主键Seq_id是bigint型,每次插入数据自增1。

变量类型错在哪里呢?
stonewater 2008-06-05
  • 打赏
  • 举报
回复
有没有主键什么的,你可以把语句拿出来在数据库上执行测试下,
第一次执行和第二次执行看看相关的变量值,比如看看vSQL有没有变化;
闪破风浪 2008-06-05
  • 打赏
  • 举报
回复
看看数据类型和数据库是否一致~
shakaqrj 2008-06-05
  • 打赏
  • 举报
回复
你的sql语句
voyagerbu 2008-06-05
  • 打赏
  • 举报
回复
数据库各表之间没有外键联系,没有约束。

[Quote=引用 3 楼 shakaqrj 的回复:]
看看你的sql
表间有没有什么约束?
[/Quote]
Eleven 2008-06-05
  • 打赏
  • 举报
回复
Up
voyagerbu 2008-06-05
  • 打赏
  • 举报
回复
主要是执行INSERT语句时发生“不正确的变量类型”或者没有捕捉到的异常。

完整性规则是不是指是否允许空的字段?表中其它字段都允许为空的。

[Quote=引用 1 楼 zaodt 的回复:]

1、检查每次执行的 SQL 语句;

2、是否违反了数据库中定义的完整性规则。
[/Quote]
CathySun118 2008-06-05
  • 打赏
  • 举报
回复
顺便请问一下,SQLServer里的字段是varchar类型的,VC的字符串类似于“123abcdef”(即可能是数字开头的)。从VC insert到数据库表中时,怎样才能和数据库中varchar类型匹配?从而避免出现“不正确的变量类型”的异常?
---------------------------------------------------------------------------------------------------------------
数字开头的字符串,并不违反规则,不会出错的.
shakaqrj 2008-06-05
  • 打赏
  • 举报
回复
看看你的sql
表间有没有什么约束?
zhoujianhei 2008-06-05
  • 打赏
  • 举报
回复


BOOL CAdoRecordSet::PutCollect(LPCTSTR strFieldName, const CString &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (! (GetFieldType(strFieldName) == adVarChar
|| GetFieldType(strFieldName) == adChar
|| GetFieldType(strFieldName) == adLongVarChar
|| GetFieldType(strFieldName) == adVarWChar
|| GetFieldType(strFieldName) == adWChar
|| GetFieldType(strFieldName) == adLongVarWChar))
TRACE(_T("Warning: 你要存贮的字段与变量的数据类型不符; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
#endif

_variant_t vt;
vt.vt = value.IsEmpty() ? VT_NULL : VT_BSTR;
vt.bstrVal = value.AllocSysString();
return PutCollect(strFieldName, vt);
}
voyagerbu 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shakaqrj 的回复:]
将RowsAffected设为NULL试试看
[/Quote]

把RowsAffected改成0,就不出现“不正确的变量类型”的异常了。不知道是为什么?
shakaqrj 2008-06-05
  • 打赏
  • 举报
回复
将RowsAffected设为NULL试试看
加载更多回复(6)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧