每次插入一个重复的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值冲突的判定语句呢?还是其他?
是要在插入前面 加上是否和KEY值冲突的判定语句呢?还是其他?
#3
你先select一下, where no=??
有记录就不插,没记录就插
有记录就不插,没记录就插
#4
恩,你可以在插入之前,先判断这条记录是否存在,如果存在,就不插入
如果已经存在了,就不要插了,
如果不存在,才能插入,
如果已经存在了,就不要插了,
如果不存在,才能插入,
#5
上面是一种方法;
还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行SQL语句。
还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行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();
}
这个是我的代码~~不是很正规
不知道~有没有什么潜在的风险~
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值冲突的判定语句呢?还是其他?
是要在插入前面 加上是否和KEY值冲突的判定语句呢?还是其他?
#3
你先select一下, where no=??
有记录就不插,没记录就插
有记录就不插,没记录就插
#4
恩,你可以在插入之前,先判断这条记录是否存在,如果存在,就不插入
如果已经存在了,就不要插了,
如果不存在,才能插入,
如果已经存在了,就不要插了,
如果不存在,才能插入,
#5
上面是一种方法;
还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行SQL语句。
还有一种方法就是捕获操作返回值,然后判断错误代码,如果遇到主键冲突就向用户提示错误信息,用户更改后,重新执行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();
}
这个是我的代码~~不是很正规
不知道~有没有什么潜在的风险~
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();
}
这个是我的代码~~不是很正规
不知道~有没有什么潜在的风险~