首页  编辑  

检测、建立数据库别名和表格

Tags: /超级猛料/Database.数据库相关/BDE和InterBase/   Date Created:
procedureSetAlias; { 设置当前数据的别名(PARADOX) }
var
  MyList: TStringList;
begin
  MyList := TStringList.Create;
  try
    withMyListdo
    begin
      Add('PATH=你的数据库的路径');
      Add('ENABLEBCD=FALSE');
    end;
    Session.AddAlias('你的数据库别名', 'PARADOX', MyList);
  finally
    MyList.Free;
  end;
end; { SetAlias }
其他数据库的一样 

  检测 、 建立数据库别名和表格
对于BDE会话期对象来说 , BDE别名特别重要 , 许多方法都需要传递一个数据库的别名作为参数 。
Tsession提供了管理BDE别名的功能 。但是作者往往等到要发布程序时才发现 ,你的程序由于找不到别名而无法运行 ,必须在一台已经装了BDE管理程序的机上才能用 ,你一定非常失望 。
不要紧 ,只要在程序中加入以下语句 ,你的程序就又可以执行 。
  AddAlias用于为Paradox 、 dBase或文本创建别名 , 不需要连接参数 , 只需指定一个路径和默认的驱动程序 。    
  AddStandardAlias函数则需要传递三个参数 , Name参数用于指定名称 , Driver参数用于指定SQLLinks驱动程序 ,
  List参数用于指定连接参数 。 
procedureTForm1.FormCreate(Sender: Tobject);
begin
  withSessiondo
  begin
    ConfigMode := cmSession;
    try
      AddStandardAlias('WorkMen', ExtractFilePath(ParamStr(0)), 'PARADOX');
    finally
      ConfigMode := cmAll;
    end;
  end;
end;
   上面的是单机版的创建别名方法 , 还有创建SQL服务器别名的方法
procedure TForm1.FormCreate(Sender: Tobject);
var
  MyList: TStringList;
begin
  MyList := TStringList.Create;
  try
    with MyList do
    begin
      Add('SERVERNAME=IB_SERVER:/PATH/DATABASE.GDB');
      Add('USERNAME=MYNAME');
    end;
    Session1.AddAlias('WorkMen', 'INTRBASE', MyList);
  finally
    MyList.Free;
  end;
end;
   要说明的是 , 调用AddStandardAlias或AddAlias函数创建的别名只存在于内存中 , 程序关闭后就没有了 ,
  要把别名永远的保存到BDE配置文件中 ,请调用SaveConfigFile函数来保存到设置文件中 。

一 、 数据库别名(Alias)的定义和检测方法 
当Type为STANDARD时, 别名定义最为简单 , 这时仅能采用PARADOX, DBASE, ASCIIDRV三种数据库作为缺省的驱动程序(DEFAULTDRIVER)。 
另外 ,还要定义数据库存放路径(PATH)和ENABLEBCD ,才能建立一个完整的数据库别名 。Delphi的数据库应用程序能自动提供一个Session组件 , 这个Session组件即为应用程序与BDE的接口 。 
1. 检测别名 
通过调用Session.GetAliasNames(list: Tstrings)方法 ,可将当前BDE配置中的所有数据库别名的名称存放到List字符串列表中 。 
list.IndexOf('需要检测的别名')的值会告诉我们这个别名是否存在(其值为 - 1 时不存在 ) 。 
2. 增加一个新的别名 
Session组件的过程AddStandardAlias(constName, PATH, DEFAULTDRIVER: string),可以增加一个标准类型的数据库别名 。 
例如增加一个名为Cntssamp ,缺省数据库驱动程序为PARADOX 、 存放路径为c: \ delphp11的别名 : 
Session.AddStandardAlias('Cntssamp', 'c:\delphp11',  'Paradox'); 
3. BDE配置文件存盘 
Session.SaveConfigFile;

二 、 数据库中表格的定义和检测方法
数据库中表格的定义 、 维护和使用 , 只有在数据库别名正确设置的情况下才有意义 。以TTable组件为例 , 必须设置其DatabaseName为一个实际存在的别名 。 
1. 检测表格是否存在
通过调用Session.GetTableNames(constDatabaseName, Pattern: string; Extensions, SystemTables: Boolean; list: Tstrings) 方法 , 可将当前指定数据库别名中所有表格的名称存放到List字符串列表中 。 list.IndexOf('需要检测的表格名')的值会告诉我们这个表格是否存在(其值为 - 1 时不存在 ) 。 
2. 建立一个表格 
第一步 ,设置TTable组件的DataBaseName(别名)、 TableName(表格名)、 TableType(数据库类型);
第二步 , 调用Table.FieldDefs.Add(constName: string; DataType: TFieldType; Size: Word; Required: Boolean)增加表格的各个字段 , 其中Name为字段名 , DataType为字段类型 ( 常用的有ftInteger, ftString, ftDate, ftBoolean等 ), Size为字段长度 , Required为该字段是否允许有空值 。 
第三步 , 调用Table.IndexDefs.Add(constName, Fields: string; Options: TIndexOptions)方法增加表格的索引文件 , 其中Name为索引文件名 , Fields为索引字段 ,options为索引参数的集合 , 常用的索引参数有ixPrimary(主键 ) 、 ixDescending(降序)、 ixUnique(具有唯一值 ) 等 。
第四步 , 调用Table.CreateTable建立表格 。

三 、 一个实例
在Form1.Formcreate事件中写入如下代码 , 程序启动时 ,将自动检测是否存在数据库别名Cntssamp ,如果没有则建立之 ;自动检测别名Cntssamp中是否存在表格TSK(图书库), 如果没有则自动建立表格TSK 。 
procedure TForm1.FormCreate(Sender: Tobject);
var
  ap: TStringList; { 字符串列表变量 }
  answer: Integer;
begin
  ap := TStringList.Create;
  Session.GetAliasNames(ap);
  { 取得别名列表 }
  if (ap.IndexOf('Cntssamp') = -1) then { 判断别名是否存在 }
  begin
    answer := Application.MessageBox('别名Cntssamp不存在, 现在创建吗 ? ', ' BDE信息窗口',
      mb_OKCancel);
    { 增加一个名为Cngzsamp的数据库别名 }
    if answer = IDCANCEL then
    begin
      ap.Free;
      Exit;
    end;
    Session.AddStandardAlias('Cntssamp', 'c:\delphp11', 'Paradox');
    Session.SaveConfigFile; { BDE配置文件存盘 }
  end;

  ap.Clear; { 取得别名Cngzsamp中的所有表格名称列表 }
  Session.GetTableNames('Cntssamp', '', False, False, ap);
  if (ap.IndexOf('TSK') = -1) then { 判断表格是否存在 }
  begin
    answer := Application.MessageBox('别名Cntssamp中不存在 表格TSK,  现在创建吗 ? ',
      ' 表格信息窗口 ', mb_OKCancel);
    ifanswer = IDCANCELthenbegin ap.Free;
    Exit;
  end;

  with table1 do
  begin
    Active := False;
    DatabaseName := 'Cntssamp'; { 数据库别名 }
    TableName := 'TSK'; { 表格名 }
    TableType := ttParadox; { 数据库类型 }

    with FieldDefs do
    begin { 增加字段 }
      Clear;
      Add('SH', ftString, 30, False); { 书号String(30) }
      Add('SM', ftString, 30, False); { 书名String(30) }
      Add('CBS', ftString, 20, False); { 出版社String(20) }
      Add('CBRQ', ftDate, 0, False); { 出版日期Date }
      Add('YS', ftInteger, 0, False); { 页数Integer }
    end;

    with IndexDefs do
    begin { 增加索引 }
      Clear; { 按书号字段建立主索引 }
      Add('SHSY', 'SH', [ixPrimary, ixUnique]);
    end;
    CreateTable; { 创建表格 }
  end;

  ap.Free; { 释放变量ap }
end;