ADO+ACCESS 插入一个Key值已经存在的记录时 数据库链接就出错了~~

时间:2021-09-20 21:42:58
我建了个表 设了一个Key “no”
每次插入一个重复的no记录后数据库就报错了~~
下面是添加记录的操作~
try
{//把对话框中的记录传递到记录集中
        m_pRecordset->AddNew();
        m_pRecordset->PutCollect("no",_variant_t(dlg.m_no));
        m_pRecordset->PutCollect("class",_variant_t(dlg.m_class));
        m_pRecordset->PutCollect("name",_variant_t(dlg.m_name));
        m_pRecordset->PutCollect("sex",_variant_t(dlg.m_sex));

        m_pRecordset->Update();//把新的记录存在数据源里
m_pRecordset->MoveLast(); 
}
catch(_com_error e)
{
        MessageBox("失败");
        return;
}

6 个解决方案

#1


主键冲突了

当然报错了,不报错反而不对了,呵呵

#2


报错后 程序就要重新启动了~~有没有改善的方法?
是要在插入前面 加上是否和KEY值冲突的判定语句呢?还是其他?

#3


你先select一下,  where no=??
有记录就不插,没记录就插

#4


恩,你可以在插入之前,先判断这条记录是否存在,如果存在,就不插入

如果已经存在了,就不要插了,

如果不存在,才能插入,

#5


上面是一种方法;

还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行SQL语句。

#6


_variant_t var;
CString s1;
try
{
m_pRecordset->Filter =_bstr_t("no = '"+dlg.m_no+"'");

var=m_pRecordset->GetCollect("no");
if(var.vt != VT_NULL)
s1 = (LPCSTR)_bstr_t(var);
m_pRecordset->Filter = (long) adFilterNone;
if(dlg.m_no== s1)
{
MessageBox("这个学号已经存在");
}
}
catch(_com_error e)
{
m_pRecordset->Filter = (long) adFilterNone;
m_pRecordset->AddNew();
m_pRecordset->PutCollect("no",_variant_t(dlg.m_no));
m_pRecordset->PutCollect("class",_variant_t(dlg.m_class));
m_pRecordset->PutCollect("name",_variant_t(dlg.m_name));
m_pRecordset->PutCollect("sex",_variant_t(dlg.m_sex));

m_pRecordset->Update();//把新的记录存在数据源里
m_pRecordset->MoveLast(); 


}
这个是我的代码~~不是很正规
不知道~有没有什么潜在的风险~

#1


主键冲突了

当然报错了,不报错反而不对了,呵呵

#2


报错后 程序就要重新启动了~~有没有改善的方法?
是要在插入前面 加上是否和KEY值冲突的判定语句呢?还是其他?

#3


你先select一下,  where no=??
有记录就不插,没记录就插

#4


恩,你可以在插入之前,先判断这条记录是否存在,如果存在,就不插入

如果已经存在了,就不要插了,

如果不存在,才能插入,

#5


上面是一种方法;

还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行SQL语句。

#6


_variant_t var;
CString s1;
try
{
m_pRecordset->Filter =_bstr_t("no = '"+dlg.m_no+"'");

var=m_pRecordset->GetCollect("no");
if(var.vt != VT_NULL)
s1 = (LPCSTR)_bstr_t(var);
m_pRecordset->Filter = (long) adFilterNone;
if(dlg.m_no== s1)
{
MessageBox("这个学号已经存在");
}
}
catch(_com_error e)
{
m_pRecordset->Filter = (long) adFilterNone;
m_pRecordset->AddNew();
m_pRecordset->PutCollect("no",_variant_t(dlg.m_no));
m_pRecordset->PutCollect("class",_variant_t(dlg.m_class));
m_pRecordset->PutCollect("name",_variant_t(dlg.m_name));
m_pRecordset->PutCollect("sex",_variant_t(dlg.m_sex));

m_pRecordset->Update();//把新的记录存在数据源里
m_pRecordset->MoveLast(); 


}
这个是我的代码~~不是很正规
不知道~有没有什么潜在的风险~