我用VC6.0开发了一个程序,里面需要开两个线程对sqlserver数据库中的同一个表进行读、写和删除,程序运行一段时间后会弹出错误对话框Microsoft Visual C++ Runtime Library,提示Runtime Error!程序名 abnormal program termination
这个错误是不是同时操作同一个表导致的?怎么解决?

解决方案 »

  1.   

    补充一下,我是用ADO操作的数据库,最好有高人给个代码参考一下子啊
      

  2.   

    同一个表进行写和删除?应该要加个锁或者临界区来进行线程同步吧,还有就是,操作数据库,一般都用异常捕捉try..catch吧
      

  3.   

    如果是通过不同的COM对象访问,不需要,数据库自己会做并发保护。如果是同一个COM对象,这是不行的,因为COM对象不能跨套间使用,如果lz使用同一个connection做,他必须首先做marshal/unmarshal,然后也许要考虑并发控制问题。在我看来,他应该每次创建新对象访问数据库
      

  4.   

    我是用了两个connection,两个线程分开用的,这样会不会有问题啊?
      

  5.   

    线程会不会访问同一个全局数据等,这样需要加锁保护...
    然后多添加Log等,先定位大概出错的位置,分析
      

  6.   

    runtime err 还是自己的代码不够健壮. 没把异常判断处理. 所以exe就异常了. 
      

  7.   

    可能数据集关闭了还在读,各种可能就很多了~
    加try...catch...捕获一下异常吧~具体问题具体分析,需要精确定位才好查错~
    try
    {
    //code
    }
    catch (_com_error& e)
    {
    AfxMessageBox(e.Description());
    }
      

  8.   

    也遇到了类似的问题!
    MFC+ACCESS ADO编程,程序在DEBUG和RELEASE下编译、链接、运行都正常,但是打包安装到另外的计算机上,运行到数据库部分就出现问题,程序如下:
    CoInitialize(NULL);
    _ConnectionPtr pConn(__uuidof(Connection));
    _RecordsetPtr pRst(__uuidof(Recordset));

    try
    {
      pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= database.mdb","","",adConnectUnspecified);//!!!!错误位置
    }
    catch (_com_error* e)
    {
      MessageBox("数据库链接失败!请检查配置文件!");
      return;
    }
    catch (CException* e)
    {
      MessageBox("中断!");
      e->Delete();
    }

    CString str;
    str.Empty();
    str="select data1 from table1 where probe='1111'";
    try
    {
    pRst=pConn->Execute((_bstr_t)str,NULL,adCmdText);
    }
    catch (_com_error *e)
    {
    MessageBox("未找到对应型号!请检查探头型号!");
    return;
    }

    pRst->MoveFirst();
    while (!pRst->rsEOF)
    {
      double dd;
      dd=pRst->GetCollect("data1");
      CString str;
      str.Format("%.12f",dd);
      MessageBox(str);
      pRst->MoveNext();
    }

    pRst->Close();
    pConn->Close();
    pRst.Release();
    pConn.Release();
    CoUninitialize();注:#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","rsEOF")在头文件已经声明本人估计是数据库路径定义问题,不知是应该定义绝对路径,还是相对路径?