MFC+ODBC,我在保存数据的时候想判断输入的数据与数据库中是否有重复,用
CString strSql1;
strSql1.Format=(SELECT * FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);
然后用GetRecordCount判断返回个数是否为0,若为0则保存,若不为0则弹出提示框。
请问这种方法可行吗?编译执行都不出错,但是按下保存按钮的时候会发生内存错误。请高手们帮帮忙!
CString strSql1;
strSql1.Format=(SELECT * FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);
然后用GetRecordCount判断返回个数是否为0,若为0则保存,若不为0则弹出提示框。
请问这种方法可行吗?编译执行都不出错,但是按下保存按钮的时候会发生内存错误。请高手们帮帮忙!
解决方案 »
- template template parameter 编译不通过
- 合同很快自然到期,我不打算继续干,应该怎么做?
- Image的问题,对大家应该不会很难
- 江湖救急:ModifyStyle或ModifyStyleEx无法改变COMBBOX控件的样式?????
- 如果调用两次CEvent::SetEvent()的时候并没有等待的线程,这时候是有信号的对吧,如果后来出现
- 再来求教。谢谢大家支持!也是关于对话框的问题。
- 求读取一文本高效率算法
- 控制打印文档的是那个进程?
- 关于〈数据结构与算法〉的几个疑问?
- 怎么动态改变位图的大小?
- VS2005+SP1,DEBUG没有问题,RELEASE 版崩溃在 mfc80.dll ! AfxCallWndProc(...)
- 对话框程序修改成单文档后的一些问题
用select count(*) from 。。
==用GetRecordCount来判断不行。
strSql1.Format=(SELECT * FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);
==这是什么乱七八糟的写法,编译也过不去啊
MessageBox(_T("用户数据库打开失败!"));
return;
}
if (mrsDataSet.IsEOF())
{
// Open all function for user
mrsDataSet.AddNew();
mrsDataSet.m_username=m_name;
mrsDataSet.m_passwords=m_pwd;
mrsDataSet.Update();
mrsDataSet.Close();
MessageBox(_T("恭喜您,注册成功!"));
}
else{
MessageBox(_T("对不起,你输入的用户名已经在使用了"));
return ;
}就这样参考一下
或者Select语句写成:
strSql1.Format(SELECT COUNT(*) FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);
然后判断查询出来的数量就知道是否有重复。
strSql1.Format("SELECT * FROM TWTPara WHERE DUTType='%s' AND ProductID='s'",m_model,m_batch);CTWTPara twtpara(&database);
twtpara.Open(AFX_DB_USE_DEFAULT_TYPE,strSql1);if(!twtpara.IsEOF())
{
MessageBox("该被测件已保存!");
return;
}
else{
CString strSql2;
CString strFormat="INSERT INTO TWTPara (Producer,DUTType,ProductID,QualityLevel,WorkEnvmt,RatedFreqL,RatedFreqH,BandWidth,OutPower,Efficiency,Gain,Other)VALUES('%s','%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s')";
strSql2.Format(strFormat,m_comp,m_model,m_batch,m_quallvl,m_env,m_freq1,m_freq2,m_bw,m_power,m_effic,m_gain,m_other);
database.ExecuteSQL(strSql2);
database.Close();
}
代码贴出来各位看看。如果把else前面的语句删掉的话代码可以正确执行,可以实现插入数据的功能。
===连%号都漏掉了怎么总是笔误呢
CTWTPara twtpara(&database);
============================
看看你database如何Open的
twtpara.Open(AFX_DB_USE_DEFAULT_TYPE,strSql1);
==仔细调试着两部分,肯定是内部出现问题了。
m_pRecordset->GetCollect
参数RecordsAffected是操作完成后所影响的行数,
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知 Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 _variant_t RecordsAffected; ///执行SQL统计命令得到包含记录条数的记录集
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText); //看到这里了吧?
_variant_t vIndex = (long)0;
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
//上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
m_pRecordset->Close();///关闭记录集
CString message;
message.Format("共有%d条记录",vCount.lVal);
AfxMessageBox(message);///显示当前记录条数
哎~~~
2. 还有那个SQL语句, 最好不用select * .... 形式, 改成
strSql1.Format=(SELECT top 1 1 FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);因为这样速度快, 比count()都快, 如果是count的话, 就不能用GetRecordCount判断记录了, 因为无论有没有数据都会返回一条记录, 只是结果值为不为0了