1.是不是把table的CachedUpdates属性设成true了??
2.是改变表的结构吧?用SQL的Alter语句
3.BDE应该有设别名的函数吧,具体是什么我也不太清楚?
至于在程序里怎么动态创建数据库,我也非常想知道,希望高人指教

解决方案 »

  1.   

    老菜鸟说得对,其实在发问之前应该先查查以前的问题,不少都有需要的答案。1.
    table.delete;//删除缓存中的记录
    table.applyupdates;//更新数据库
    table.commitupdates;//清除缓存
    如果放弃删除用table.cancelupdates;//放弃提交,清除缓存2.jeaking(空空)说得对,看看BDE的Local SQL Guide帮助,很清楚3.看看BDE的Local SQL Guide帮助,好像是create database...记不清了,自己看吧
      

  2.   

    用foxpro生成的数据库好像的确有这问题,好像有高手已经解决了。看看以前的贴子吧!
    改变表结构同意jeaking的说法
    想动态设置BDE的参数就建议不用alias,而是调用Tdatabase这个控件吧!
    用这个空间你可以用程序随便设置它的参数,包括driverName,连接参数等。
      

  3.   

    var T: Ttable;
    begin
      T:=Ttable.create(self);
      T.databasename:='';
      .....
    end;
    书上有的是!!!!!!!!!!!!!
      

  4.   

    这里有一篇文章,希望能解决你的第三个问题:在Delphi代码中建立和使用别名
      通常我们在Delphi外,通过使用Borland数据库引擎(BDE)的设置单元(bdecfg.exe)来建立和设置别名(Alias),但是,实际上用户可以在Delphi或应用程序中用TDatabase Com ponent或其他方法建立和使用别名,而不必在IDAPI.CFG中预先定义。  建立有效的别名是非常重要的,别名详细说明了数据库的定位信息和连接数据库服务器的参数,当发布应用程序时不必担心IDAPI.CFG中是否有某项设置。  利用TDatabase Component建立别名
      建立和设置一个使用标准数据库的别名的步骤如下。  1.建立一个新工程(Project)。  2.将组件(Component) TDatabase、TTable、TDataSource、TDBGrid和TButton放在FORM上。  3.双击TDatabase Component 或在TDatabase快速菜单上选择Database Editor 运行Database属性编辑器。  4.将Database Name 设置成‘ZldchAlias’,这个名字将被当作别名,用来设置数据集组件TTable、TQuery、TStoredProc等的DatabaseName属性。  5.将Driver Name设置成STANDARD。  6.单击Defaults按钮,将 PATH= 自动加在 Parameter Overrides
     框中。  7.将PATH=设置成PATH=C:,单击OK按钮关闭 Database Editor。  8.单击OK按钮关闭Database Editor。  9.将TTable的DatabaseName 属性设置成‘ZldchAlias’。  10.将TDataSource的DataSet 属性设置成‘Table1’。  11.将DBGrid的DataSource属性设置成‘DataSource1’。  12.在Tbutton的OnClick事件过程中加入下列代码:
      procedure TForm1.Button1Click(Sender:Tobject);
      begin
      Table1.Tablename=‘customer’;
      Table1.Active:=true;
      end;
      13.运行程序。  上面3~12步也可以用以下过程实现:
      MyAddStandAlias(AliasN: String;DbLocat: String;DriverN:string );
      {AliasN 别名名,DbLocat 数据库定位目录,DriverN 联结驱动类型}
      begin
      with Form1.Database1 do
      begin
      DatabaseName:= AliasN;
       DriverName:= ‘STANDARD’;
       Params.Clear;
       Params.Add(‘PATH=’+DbLocat);
       Params.Add(‘DEFAULT DRIVER=’+DriverN);
      end
      end;
      procedure TForm1.Button1Click(Sender:Tobject);
      begin
      MyAddStandAlias(‘ZldchAlias’,‘C:PARADOX’);
       Table1.DatabaseName:=‘ZldchAlias’;
       DataSource1.DataSet:= Table1;
       DBGrid1.DataSource:= DataSource1;
      Table1.Tablename=‘customer’;
      Table1.Active:=true;
      end;
      建立使用INTRBASE数据库的别名
      建立使用INTRBASE数据库别名的步骤如下。  1~4步同上。  5.将Driver Name 设置为INTRBASE。  6.单击Defaults 按钮,下列内容会自动加在 Parameter Overrides 框中:
      SERVER NAME=IB_SERVER:/PATH/DATABASE.GDB
      USER NAME=MYNAME
      OPEN MODE=READ/WRITE
      SCHEMA CACHE SIZE=8
      LANGDRIVER=
      SQLQRYMODE=
      SQLPASSTHRU MODE=NOT SHARED
      SCHEMA CACHE TIME =-1
      PASSWORD=
      7.将以上内容改为:
      SERVER NAME=C:\Program Files\Borland\Delphi 3\Demos\Data\EMPLOYEE.GDB
      USER NAME=SYSDBA
      OPEN MODE=READ/WRITE
      SCHEMA CACHE SIZE=8
      LANGDRIVER=
      SQLQRYMODE=
      SQLPASSTHRU MODE=NOT SHARED
      SCHEMA CACHE TIME =-1
      PASSWORD=masterkey
      8.将TDatabase 的属性LoginPrompt设置成‘False’,如用户在Parameter Overrid es框中给出了正确的PASSWORD,连接数据库时将不会提示要求输入口令。请注意:如果在Parameter Overrides 框中给出的PASSWORD不正确,而TDatabase 的属性LoginPrompt设置为‘False’,程序运行时将出错,但并不会提示要求重新输入正确口令。Intrbase安装后,系统唯一授权的用户是SYSDBA,缺省口令是"masterkey",所有其他的用户都必须由SY SDBA添加,所以在Intrbase系统安装后要尽快更改用户SYSDBA的口令。  9、10、12步同上文的8、9、11步。  11.将TDataSource的DataSet 属性设置成‘Query1’。  13.在Tbutton的OnClick事件过程中加入下列代码:
      procedure TForm1.Button1Click(Sender:Tobject);
      begin
      Query1.SQL.Clear;
      Query1.SQL.ADD(‘SELECT DISTINCT * FROM CUSTOMER C ,SALES S WHERE (S.CUS T_NO=C.CUST_NO) ORDER BY C.CUST_NO, C.CUSTOMER’);
      Query1.Active:=True;
      end;
      14.运行程序。  过程MyAddStandAlias的参数可以通过各种方式赋值。目录、服务器名、路径、数据库名和其他别名所需的参数都可以通过输入对话框或从.INI文件读入程序中。通过以上方法建立的别名只在程序运行时存在,其他应用程序不能使用。  利用Session建立、修改、删除别名
      所有数据库管理应用程序都自动提供一个名为Session的Session组件。每个和数据库程序相关的数据集组件都包含SessionName属性,它决定了和该组件相关的Session组件。因为Session封装了一系列数据库连接特性,大部分Session组件的方法都通过BDE别名工作。每个和Session有关联的数据库组件都有别名(尽管在处理PARADOX和DBASE
     数据库时,完整的路径可以取代别名),通过Session可以检测和决定别名的可见性、跟踪别名名和其他连接驱动信息以及建立、修改和删除别名。  Session的设置模式(ConfigMode)属性,决定了什么样的BDE别名对它是可见的。默认设置是cmAll,它可解释成[cfmVirtual or cfmPersistent]。如果设置模式值为cmAll,由Session建立的所有别名、用户系统BDE设置文件中预定义的别名以及BDE在内存中维护的所有别名均可见。  设置模式的主要目的是,允许应用程序详细说明和限定别名在Session级别上的可见性。例如把设置模式设置成[cfmSession],可使Session只可见那些由其建立的别名,所有其他的别名都无效。  当别名在Session存在期间建立后,BDE在内存中建立一个它的拷贝。这个局部拷贝只对建立它的Session有效,除非在同一个应用程序中其他Session的模式设置成cmAll或cf mPersistent。  使用Session的SaveConfigFile方法,可以将内存中的别名写入BDE设置文件中,这样其他BDE允许的应用程序就可以使用该别名。  Session组件有五个方法,允许应用程序跟踪BDE别名的参数和驱动程序等信息:
      GetAliasNames:列出Session已经处理过的别名;
      GetAliasParams:列出指定的别名的参数;
      GetAliasDriverName:返回包含别名使用的驱动程序名的字符串;
      GetDriverNames:返回所有有效的BDE驱动程序;
      GetDriverParams:返回指定的驱动程序的驱动参数。  Session可以在其存在期间建立、修改和删除别名。方法AddAlias为SQL数据库服务器建立一个新的BDE据工作区。方法AddStandardAlias为PARADOX、DBASE、ASCII表建立一个新的BDE标准别名。  AddAlias 需要三个参数:一个包含别名工作区名的字符串、一个说明SQL连接驱动类型的字符串、一个汇集连接参数的列表字符串,其格式为:
      procedure AddAlias(const Name, Driver: string; List: TStrings);
      AddStandardAlias 需要三个参数:别名名、PARADOX和DBASE表存放的完整路径、当试图打开一个没有扩展名表时的默认驱动类型,其格式为:
      procedure AddStandardAlias(const Name, Path, DefaultDriver: string);
      当为Session添加一个别名时,它仅对该Session和其他设置模式值为cfmPersistent 的Session有效。为了使新建的别名对所有的应用程序有效,在建立别名后应该调用Save ConfigFile方法。  修改别名可以调用过程ModifyAlias,它需要二个参数:将要修改的别名名和包含修改后连接参数值的列表串,格式为:
      procedure ModifyAlias(Name: string; List: TStrings);
      方法DeleteAlias可以使别名对Session无效,但它不会删除写入BDE设置文件的别名。如果要将其从BDE设置文件中删除,需要在调用DeleteAlias后再调用SaveConfigFile。DeleteAlias只需一个参数:别名名。其格式为:
      procedure DeleteAlias(const Name: string);
      利用Session操作别名具有更大的灵活性,将给编程和发布程序尤其是C/S应用程序带来很大方便。以上例程在Win95、Delphi 3.0下调试通过。  张来东 常虹
      《计算机世界报》98年第17期
      

  5.   

    table    !!!!
      

  6.   

    1.为何逻辑删除?  逻辑删除只加个标记,速度极度快,如果改成物理删除,会 
                     降低速度,因为DBF实际是一个很简单的文件格式,物理删除
                     会引起数据文件内容的大搬动,若有10万条记录,你要物理删除
                     第一条,下面(10万-1)条要向上搬动,多么费时!FOXPRO的DELETE也
                     是先逻辑删除,PACK才真正删除; 物理删除会引起重新构造数据库
                     文件,影响了“共享”,所有物理删除要“独占”打开;
    2.怎样物理删除?
                     BDE对DBF仍提供了一个类似FOXPRO的PACK 功能,但要独占方式    
                     打开,这个贴子很多,下面是C++BUILDER5的做法,DELPHI 类似:
    void  PackDbf(TTable *Table1)
    {
          bool stat=Table1->Exclusive;
          void *CurPos=NULL;
          if (!stat)  //共享打开时
             {
               try
                 {
                   if (!Table1->IsEmpty())
                      CurPos=Table1->GetBook();
                 }
               catch(...)
                 {
                   CurPos=NULL;
                 }
               Table1->Close();
               Table1->Exclusive=true;  //重新改成独占打开
               try
                 {
                   Table1->Open();
                 }
               catch(...)
                 {
                   ShowMessage("出错:不能以独占方式打开!");
                 }
             }
         if (Table1->Active)
             {
               DbiPackTable(Table1->DBHandle,Table1->Handle,
                           NULL,szDBASE,true);
               Table1->Refresh();
             }
         if (!stat)
             {          //原来是共享打开时
               Table1->Close();
               Table1->Exclusive=false;
               Table1->Open();       
               if (CurPos!=NULL)
                  {
                    try
                      {
                        Table1->GotoBook(CurPos);
                      }
                    catch(...){};
                    Table1->FreeBook(CurPos);
                  }
             }
    }
       在你的程序退出再执行这个PackTable()子程序,但如果
    你的数据库较小,可把它放在Table1.AfterDelete()事件中,
    随时物理删除;
      

  7.   

    MM漂亮,我们都爱凑热闹,呵呵,其实那MM是假的!
      

  8.   

    呵呵,知道是MM,xiaoduan(一个梦想)口水都流出来了....
      

  9.   

    MM怎么都那么多傻问题,难怪MM适合用脸蛋,而不是用脑子!!!!!!!!
      

  10.   

    To xy_dong(小董) 
    不要这样说妹妹。要注意团结群众!
      

  11.   

    你们听着,?也不嫺欺?MM,不徢呢,我可以,MM,你嬼的是真的吗
      

  12.   

    我想你一定把table的cachedupdates属性设为true 了。
    是这种情况下 用  ttablename.delete 后数据并末真正删除。
    可以用 ttablename.cancel 恢复数据。如果在ttablename.delete 后
    再执行ttablename.post 就真正删除数据了。