数据库连接:ado+access
ado控件:adoconnection, adoquery, datasource
初始化主窗口出现问题:04A0CA内存非法读000064内存区。去掉adoquery控件就没事了,为什么?

解决方案 »

  1.   

    你别手工设置TADOQuery的连接,使用代码实现TADOQuery的连接字符串、表、打开
      

  2.   

    我说得不够详细,adoquery通过adoconnection连接,因为主窗口初始化需要从数据库取数据操作。但是一旦有adoquery出现(变量声明除外)就会有内存非法报错出现,并非数据库的操作出错了。单独的测试程序纯粹数据库操作是没问题的,但是整个程序运行就报错。把出现adoquery的语句去掉一切都很好。我程序本身没有太多的内存操作,而且都很简单。我只想知道会不会是什么控件与他是冲突的?
      

  3.   

    你直接就可以用adoquery实现连接的
    设置好connectionstring
    在sql添好语句
    然后active:=true;
    就ok
    这些也可以杂程序中写出
      

  4.   

    你的系统是不是2K/XP/2003?  如果是 我也有遇到过 一般点掉以后继续F9 还是可以编译成的  并且直接执行EXE 就没这毛病 
    还有你在设计的时候不要吧 ADOTABLE 打开 编译的的时候也不会出现
    一直不明白是怎么会事 装了最新的MDAC 也没用    关注
      

  5.   

    active:=false;
    看看它还报错么?如果不报错了帖出你的SQL和connectionString
      

  6.   

    在Form初始化完成后才能连接Database(即才能将AdoQuery1.Active:=True;否则设为False)。
      

  7.   

    源码:
    MainForm.FormCreate:
      temp := Connection.open('COM1');      //打开串口
      if not temp then temp := Connection.open('COM2');
      if not temp then ShowMessage('通讯端口已被占用,请关闭相应的程序');  
      SendCard := TSendCard.Create;TSendCard.Create:
      CardData := TCardData.Create;
      DM := TDM.Create(Application);       //建立DataModule单元,ADOQuery1在此建立
      SafeNum := CardData.GetSafeNum;      //这里涉及数据库操作
    CardData.GetSafeNum:
      SQLStr := 'select Safe_Unit from Control where 1=1';
      with ADOQuery1 do       //报错
      begin
        close;
        SQL.Clear;
        SQL.Add(SQLStr);
      end;  
      qryConnect.Open;
      if DM.ADOQuery1.Eof then Result := 0
      else
      Result := DM.ADOQuery1.FieldValues['Safe_Unit'];
      

  8.   

    不要在form的create中,放到show中执行代码
      

  9.   

    问题已经解决:因为GetSafeNum函数原先在DM单元里,后来因为逻辑关系改变放入CardData class中,引用TDM class却没有初始化。谢谢大家关注!