我通过“管理工具---数据源 (ODBC)”创建了一个新的用户数据源(对应的驱动程序选择Microsoft Access Driver)。在VC中添加一个对应的新类class CEmploy : public Crecordset。使用以下语句在表中添加第一条记录:
EmployerSet.AddNew();
EmployerSet.m_ID = …;

EmployerSet.Update();
如果表中一条记录都没有,运行到语句EmployerSet.Update()时肯定出错。如果表中已有记录,则不出错。特此请教。另外,如何把上述手工创建数据源的过程放到安装程序中实现自动创建,也请赐教。

解决方案 »

  1.   

    1
    在AddNew()前加上EmployerSet.SetFieldNULL(NULL);2
    Q 用代码实现自动注册一个工程目录下的access数据库的ODBC数据源
    A
    CString sPath;
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);//得到程序的路径
    sPath.ReleaseBuffer ();
    int nPos;
    nPos=sPath.ReverseFind('\\');
    sPath=sPath.Left(nPos);
    nPos=sPath.ReverseFind('\\');
    sPath=sPath.Left(nPos);
    CString lpszFile=sPath+"\\lhwy.mdb"; //得到程序目录下的数据库的完整路径
    char* szDesc;
    int mlen;
    szDesc=new char[256];
    sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s??","lhwy",lpszFile,sPath); //形成一个SQLConfigDataSource函数参数串结构
    mlen = strlen(szDesc);
    for (int i=0; i{
      if(szDesc[i]=='?')
            szDesc[i] = '\0'; //替换上面串的?为\0,形成一个完整的串
    }
    if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))//注册数据库
         AfxMessageBox("SQLConfigDataSource Failed");
      

  2.   


    应该是你的表中有时间类型的字段。对于时间类型的字段,在映射的CRecordset类中会将改字段映射为CTime类型的变量,但在构造函数中没有给该变量赋初值,所以会出现你所说的问题。解决的办法有两种:
    1、在构造函数中给该CTime类型的变量赋初值
    2、将映射变量的类型改为COleDateTime。