vc数据库专家们你们在哪儿,快来帮帮俺吧!

skyrain 2000-08-28 03:56:00
我用VC ODBC开发数据库,但在调用m_pSet->AddNew();时报纪录集为只读?我该怎么解决?
请各位大侠们帮忙,我几经没有办法了,如果还有其他的ODBC办法也行急!!!
我的数据库名字是test.mdb
有一个表单ziliao
有两个字段 "名字"和"年龄"
...全文
510 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
--茶-- 2000-08-29
  • 打赏
  • 举报
回复
我使用Dao方法添加数据记录,对ODBC不知是否可行,仅供参考:(其实,在VC中访问数据库,完全没有必要使用AppWizard自动设置数据源,使用ODBC数据源直接调用CDatabase、CRecordset类即可,如果使用DAO接口,直接调用CDaoDatabase、CDaoRecordset类即可)
CDaoDatabase dbDst;
.....//打开数据库
CDaoRecordset rsDst(&dbDst);
rsDst.Open(dbOpenTable,LPCTSTR(tbfinfo.m_strName),0);//打开数据表名称
for(int c=0; c<countSrc;c++)//以源数据表的记录数来控制目标数据表的记录数
{
rsDst.AddNew();
rsDst.Update();
rsDst.SetBookmark(rsDst.GetLastModifiedBookmark());
}
//然后添加数据
rsSrc.MoveFirst();
rsDst.MoveFirst();
while(!rsSrc.IsEOF())
{
COleVariant var;
for(int k=0;k<21;k++){
rsDst.Edit();
rsSrc.GetFieldValue(k,var);
TRY
{
rsDst.SetFieldValue(k,var);
rsDst.Update();
}
CATCH (CDaoException, e){ e=NULL;
AND_CATCH (CMemoryException, e)
{
e=NULL;
}
END_CATCH
}
rsSrc.MoveNext();
rsDst.MoveNext();
}//循环结束,数据复制完毕
skyrain 2000-08-29
  • 打赏
  • 举报
回复
CDatebase db
db.ExecuteSQL
("INSERT INTO ziliao1(name) values('123')"); 到底行不行呀
我试验了,出错,并且没有错误码,是还需要其他的设置吗?
ODBC API中怎么用INSRT语句?我用的时间编译报类型不匹配
ufc 2000-08-29
  • 打赏
  • 举报
回复
ExecuteSQL("")括号内是标准SQL语句啊,应写成ExecuteSQL
("INSERT INTO ziliao1(name) values('123')"); ziliao1 为你数据库的里的表名,name应是表里的字段名 当然你可以用ODBC API去实现,但MFC ODBC 应更方便
skyrain 2000-08-29
  • 打赏
  • 举报
回复
我知道原因在于我的def...SQL()返回了3个表单,所以不能执行更改纪录操作
ufc的方法我也试验过
CDatabase db;
db.xecuteSQL("INSERT INTO 'ziliao1'('name')VELUES('123')");编译通过,执行报没有错误号的错误
如果这个方法可行请告诉我怎么做

我现在想用ODBCAPISQLHENV henv;SQLRETURN retcode;SQLHDBC hdbc;SQLHSTMT hstmt;
retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
//
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0
);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
//SQLSetConnectAttr(hdbc,(void *)SQL_LOGIN_TIMEOUT, 5, 0);

retcode = SQLConnect(hdbc, (SQLCHAR*)"ziliao",SQL_NTS,NULL,SQL_NTS
,NULL,SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_I
NFO)
{
///在这儿怎么运用INSERT方法???
///急!!!!
///处理数据

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}


ufc 2000-08-28
  • 打赏
  • 举报
回复
如果是在引导下与数据库相连建立的程序,则把snapshot(默认的)改成dynaset就行了,你可以
查到它,当然也可更简单地用MFC ODBC,用CDatabase的 Open 一个数据库,然后直接用ExecuteSQL来执行SQL语句,非常方便,再结合CRecordSet 你能完成一切,请给我加分
iceberg 2000-08-28
  • 打赏
  • 举报
回复
把你打开即操作表的源码贴上来,我们好为你会诊:)
skyrain 2000-08-28
  • 打赏
  • 举报
回复
你说的构造函数是自己写还
是MFC自动生成的?该怎样指定?能不能讲清楚一点,谢谢!(文件属性没问题)
PatrickGamp 2000-08-28
  • 打赏
  • 举报
回复
Sunlet说的没错,在构造函数中指定就可,如果仍然有错,检查文件属性是否只读.
skyrain 2000-08-28
  • 打赏
  • 举报
回复
高手们救救我吧!!!
skyrain 2000-08-28
  • 打赏
  • 举报
回复
MFC创建时m_pSet已经打开了数据库,应该在哪儿设置让它用可以增加的方式打开??
skyrain 2000-08-28
  • 打赏
  • 举报
回复
我全部用MFC自己创建的类,只更改了在初始数据时的那句 ...type=dynaset
可是不行,你说的创建是自己创建吗?
skyrain 2000-08-28
  • 打赏
  • 举报
回复
我设置了...type=dynaset呀,你说的方法创建时间设置应该在什么地方设?
Sunlet 2000-08-28
  • 打赏
  • 举报
回复
创建m_pSet对应的类时有两种模式,动态模式与快照模式.如果想addnew,应该动态模式.

4,011

社区成员

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

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