与Access数据库结构有关的一些函数

与Access数据库结构有关的一些函数


//与数据库结构有关的一些函数
//1、动态改变字段名称
uses ComObj;
//Access
//TableName: 表名; OldColName: 原字段名; NewColName: 新字段名;
procedure RenameField(const TableName, OldColName, NewColName: string);
var
  DB, Col: OleVariant;
begin
  DB := CreateOleObject('ADOX.Catalog');
  DB.ActiveConnection := ADOConnection1.ConnectionObject;
  Col := CreateOleObject('ADOX.Column');
  Col := DB.Tables[TableName].Columns[OldColName];
  Col.Name := NewColName;
end;

//SQLServer
procedure RenameField(const TableName, OldColName, NewColName: string);
begin
  with ADOCommand1 do
  begin
    CommandText := 'EXEC sp_rename ''' + TableName + '.' + OldColName +
      ''',''' + NewColName + ''',''COLUMN'';';
    Excute;
  end;
end;

2、取得 Access 库中的表结构
type
  TTableDef = record
    Name,
    DateCreated,
    LastUpdated,
    Description: string;
  end;

  TTableDefs = array of TTableDef;

procedure GetTableDefs(const DBName: string; out TableDefs: TTableDefs);
var
  DBEngine, DB: OleVariant;
  I: Longint;
begin
  try
    DBEngine := CreateOleObject('DAO.DBEngine.36');
    DB := DBEngine.OpenDatabase(DBName);
    SetLength(TableDefs, Longint(DB.TableDefs.Count));
    for I := Low(TableDefs) to High(TableDefs) do
    begin
      TableDefs[I].Name := DB.TableDefs[I].Name;
      TableDefs[I].DateCreated := DB.TableDefs[I].DateCreated;
      TableDefs[I].LastUpdated := DB.TableDefs[I].LastUpdated;
      try
        TableDefs[I].Description := DB.TableDefs[I].Properties['Description'].Value;
      except
        TableDefs[I].Description := '';
      end;
    end;
  finally
    DB := Unassigned;
    DBEngine := Unassigned;
  end;
end;

3、取得 Access 表中的字段结构
type
  TFieldDef = record
    Name: string;
    Types,
    Size: Longint;
    Description: string;
  end;

  TFieldDefs = array of TFieldDef;

procedure GetFieldDefs(const DBName, TableName: string; out FieldDefs: TFieldDefs);
var
  DBEngine, DB: OleVariant;
  I: Longint;
begin
  try
    DBEngine := CreateOleObject('DAO.DBEngine.36');
    DB := DBEngine.OpenDatabase(DBName);
    SetLength(FieldDefs, Longint(DB.TableDefs[TableName].Fields.Count));
    for I := Low(FieldDefs) to High(FieldDefs) do
    begin
      FieldDefs[I].Name := DB.TableDefs[TableName].Fields[I].Name;
      FieldDefs[I].Types := DB.TableDefs[TableName].Fields[I].Type;
      FieldDefs[I].Size := DB.TableDefs[TableName].Fields[I].Size;
      try
        FieldDefs[I].Description := DB.TableDefs[TableName].Fields[I].Properties['Description'].Value;
      except
        FieldDefs[I].Description := '';
      end;
    end;
  finally
    DB := Unassigned;
    DBEngine := Unassigned;
  end;
end;


打印MSAccess2000数据库结构信息

阅读: 576次   时间:2003-08-19 00:00:00   字体:[ 大 中 小]
下列程序可以打印 MS Access 2000 数据库结构信息
若有问题请联系: xinsheng_chang@163.com
               0710-6545726
ReportControl、tvAPIThing 单元可在网上找,也可以与作者联系。


unit GetDBStruInfo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, ExtCtrls, ReportControl, Grids, DBGrids,
  tvAPIThing, Buttons;

type
  TGetDBStruInfoFrm = class(TForm)
    ADOConnection1: TADOConnection;
    ListBox1: TListBox;
    Panel1: TPanel;
    Button1: TButton;
    ADOTable1: TADOTable;
    ADOTable2: TADOTable;
    ADOConnection2: TADOConnection;
    ReportRunTime1: TReportRunTime;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    BitBtn1: TBitBtn;
    Bevel1: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    tvAPIThing1: TtvAPIThing;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    function GetFieldType(ly: TFieldType): string;
    function GetFieldBZ(ly: TFieldType): string;
    procedure Button2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  GetDBStruInfoFrm: TGetDBStruInfoFrm;
  dbnamevar: string;
implementation

{$R *.dfm}

procedure TGetDBStruInfoFrm.Button1Click(Sender: TObject);
var
  i, j, k, p: integer;
  mytextfile: TextFile;
begin
  ADOConnection1.Connected := false;
  OpenDialog1.Title := '请选择数据库';
  OpenDialog1.Filter := 'MS Access files (*.mdb)|*.mdb';


  if not OpenDialog1.Execute then
    exit;
  if OpenDialog1.FileName = '' then
    exit;
  ADOConnection1.ConnectionString :=
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
    OpenDialog1.FileName;
  dbnamevar := OpenDialog1.FileName;
  Label2.Caption := dbnamevar;
  Refresh;
  AssignFile(mytextfile, ExtractFilePath(Application.exename) +
    'DBStruInfo.txt');
  ReWrite(mytextfile);
  writeln(mytextfile, '序号,', '名称,', '字段类型,', '字段宽度,', '备注');
  screen.cursor := crHourGlass;
  try
    ADOConnection1.GetTableNames(listbox1.Items, false);
    j := listbox1.Items.Count;
    for i := 0 to j - 1 do
    begin
      ADOTable1.Active := false;
      writeln(mytextfile, 'B', 100 + i + 1, ',', listbox1.items[i]);
      ADOTable1.TableName := '[' + listbox1.items[i] + ']';
      ADOTable1.Active := true;
      p := ADOTable1.FieldCount;
      for k := 0 to p - 1 do
      begin
        writeln(mytextfile, 'B', 100 + i + 1, 'ZD', 100 + k + 1, ',',
          ADOTable1.Fields[K].FieldName,
          ',', GetFieldType(ADOTable1.Fields[k].DataType), ',',
            ADOTable1.Fields[k].Size,
          ',', GetFieldBZ(ADOTable1.Fields[k].DataType));
      end;
    end;
    Button2.Enabled := true;
  finally
    closefile(mytextfile);
    ADOConnection1.Connected := false;
    screen.cursor := crDefault;
    SHOWMESSAGE('完成!');
  end;
end;







function TGetDBStruInfoFrm.GetFieldType(ly: TFieldType): string;
begin
  case ly of
    ftUnknown: Result := 'Unknown';
    ftString: Result := 'Character or string';
    ftSmallint: Result := '16-bit integer';
    ftInteger: Result := '32-bit integer';
    ftWord: Result := '16-bit unsigned integer';
    ftBoolean: Result := 'Boolean';
    ftFloat: Result := 'Floating-point numeric';
    ftCurrency: Result := 'Money';
    ftBCD: Result := 'Binary-Coded Decimal';
    ftDate: Result := 'Date';
    ftTime: Result := 'Time';
    ftDateTime: Result := 'Date and time';
    ftBytes: Result := 'Fixed number of bytes';
    ftVarBytes: Result := 'Variable number of bytes';
    ftAutoInc: Result := 'Auto-incrementing 32-bit integer counter';
    ftBlob: Result := 'Binary Large OBject';
    ftMemo: Result := 'Text memo';
    ftGraphic: Result := 'Bitmap';
    ftFmtMemo: Result := 'Formatted text memo';
    ftParadoxOle: Result := 'Paradox OLE';
    ftDBaseOle: Result := 'dBASE OLE';
    ftTypedBinary: Result := 'Typed binary';
    ftCursor: Result :=
      'Output cursor from an Oracle stored procedure (TParam only)';
    ftFixedChar: Result := 'Fixed character';
    ftWideString: Result := 'Wide string';
    ftLargeint: Result := 'Large integer';
    ftADT: Result := 'Abstract Data Type';
    ftArray: Result := 'Array';
    ftReference: Result := 'REF';
    ftDataSet: Result := 'DataSet';
    ftOraBlob: Result := 'BLOB in Oracle 8 tables';
    ftOraClob: Result := 'CLOB in Oracle 8 tables';
    ftVariant: Result := 'Data of unknown or undetermined type';
    ftInterface: Result := 'References to interfaces';
    ftIDispatch: Result := 'References to IDispatch interfaces';
    ftGuid: Result := 'globally unique identifier (GUID) values';
    ftTimeStamp: Result := 'Date and time field accessed through dbExpress';
    ftFMTBcd: Result :=
      'Binary-Coded Decimal field that is too large for ftBCD';
  else
    Result := '不知道';
  end;
end;





function TGetDBStruInfoFrm.GetFieldBZ(ly: TFieldType): string;
begin
  case ly of
    ftUnknown: Result := 'Unknown or undetermined';
    ftString: Result := 'Character or string field';
    ftSmallint: Result := '16-bit integer field';
    ftInteger: Result := '32-bit integer field';
    ftWord: Result := '16-bit unsigned integer field';
    ftBoolean: Result := 'Boolean field';
    ftFloat: Result := 'Floating-point numeric field';
    ftCurrency: Result := 'Money field';
    ftBCD: Result :=
      'Binary-Coded Decimal field that can be converted to Currency type without a loss of precision';
    ftDate: Result := 'Date field';
    ftTime: Result := 'Time field';
    ftDateTime: Result := 'Date and time field';
    ftBytes: Result := 'Fixed number of bytes (binary storage)';
    ftVarBytes: Result := 'Variable number of bytes (binary storage)';
    ftAutoInc: Result := 'Auto-incrementing 32-bit integer counter field';
    ftBlob: Result := 'Binary Large OBject field';
    ftMemo: Result := 'Text memo field';
    ftGraphic: Result := 'Bitmap field';
    ftFmtMemo: Result := 'Formatted text memo field';
    ftParadoxOle: Result := 'Paradox OLE field';
    ftDBaseOle: Result := 'dBASE OLE field';
    ftTypedBinary: Result := 'Typed binary field';
    ftCursor: Result :=
      'Output cursor from an Oracle stored procedure (TParam only)';
    ftFixedChar: Result := 'Fixed character field';
    ftWideString: Result := 'Wide string field';
    ftLargeint: Result := 'Large integer field';
    ftADT: Result := 'Abstract Data Type field';
    ftArray: Result := 'Array field';
    ftReference: Result := 'REF field';
    ftDataSet: Result := 'DataSet field';
    ftOraBlob: Result := 'BLOB fields in Oracle 8 tables';
    ftOraClob: Result := 'CLOB fields in Oracle 8 tables';
    ftVariant: Result := 'Data of unknown or undetermined type';
    ftInterface: Result := 'References to interfaces (IUnknown)';
    ftIDispatch: Result := 'References to IDispatch interfaces';
    ftGuid: Result := 'globally unique identifier (GUID) values';
    ftTimeStamp: Result := 'Date and time field accessed through dbExpress';
    ftFMTBcd: Result :=
      'Binary-Coded Decimal field that is too large for ftBCD';
  else
    Result := '不知道';
  end;

end;





procedure TGetDBStruInfoFrm.Button2Click(Sender: TObject);
begin
  ADOConnection2.Connected := false;
  ADOConnection2.ConnectionString := 'Provider=MSDASQL.1;' +
    'Persist Security Info=False;' +
    'Extended Properties="' +
    'DefaultDir=' + ExtractFiledir(Application.exename) + ';' +
    'Driver={Microsoft Text Driver (*.txt; *.csv)};' +
    'DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;' +
    'FILEDSN=' + ExtractFiledir(Application.exename) + '\misdbstrue;' +
    'MaxBufferSize=2048;MaxScanRows=25;PageTimeout=5;' +
    'SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"';
  if not ADOTable2.Active then
    ADOTable2.Active := true;
  SetCurrentDir(ExtractFiledir(Application.exename));
  ADOTable2.DisableControls;
  ReportRunTime1.ReportFile := ExtractFilePath(Application.exename) +
    'misdbstrueinfo.ept';
  with ReportRunTime1 do
  begin
    EnableEdit := True;
    SetDataSet('d1', ADOTable2); //设置报表模板中的数据集变量名
    SetVarValue('DBName', dbnamevar); //设置报表模板中的字符变量内容
    //      SetVarValue('GSNAME',GSNameVar);                //设置报表模板中的字符变量内容
    //      SetVarValue('code',Code1);
    PrintPreview(True); //打印
  end;
  ADOTable2.DisableControls;
  ADOTable2.Active := false;
  ADOConnection2.Connected := false;
end;

procedure TGetDBStruInfoFrm.BitBtn1Click(Sender: TObject);
begin
  close;
end;





procedure TGetDBStruInfoFrm.Button3Click(Sender: TObject);
var
  s1, s2: string;
  x: TFixedFileInfo;
begin
  x := tvAPIThing1.FileInfo(Application.ExeName);
  s1 := tvAPIThing1.GetFileInformation(Application.ExeName, 'InternalName'); //
  s2 := Application.Title + #13#10 +
    'Version: ' + IntToStr(x.wFileVersionLS) + '.'
    + IntToStr(x.wFileVersionMS) +
    ' (Build: ' + IntToStr(x.wProductVersionMS) + ') Release: ' +
    IntToStr(x.wProductVersionLS) + #13#10 +
      tvAPIThing1.GetFileInformation(Application.ExeName, 'CompanyName')
    + #13#10 + 'E-mail:xinsheng_chang@163.com';
  tvAPIThing1.ShellAbout(s1, s2);
end;

end.

  1. Public Sub getTables()
  2.     Dim rs As New ADODB.Recordset
  3.     Dim conn As ADODB.Connection
  4.     Dim sSql As String
  5.     
  6.     
  7.     Set conn = CurrentProject.Connection
  8.     sSql = "select id,Name from MSysObjects where Type=1 and flags=0"
  9.     rs.Open sSql, conn
  10.     Do While Not rs.EOF
  11.         Debug.Print "****"; rs.Fields("Name").Value; "****************"
  12.         getTableColumns rs.Fields("Name").Value
  13.         rs.MoveNext
  14.     Loop
  15.     rs.Close
  16.     Set rs = Nothing
  17.     Set conn = Nothing
  18.     
  19. End Sub

  20. Public Sub getTableColumns(sTableName As String)
  21.     Dim rs As New ADODB.Recordset
  22.     Dim conn As ADODB.Connection
  23.     Dim fld As ADODB.Field

  24.     Set conn = CurrentProject.Connection
  25.     rs.Open sTableName, conn, , , adCmdTable

  26.     
  27.     For Each fld In rs.Fields
  28.         Debug.Print fld.Name, sFldType(fld.Type), fld.NumericScale, fld.Precision
  29.         
  30.     Next
  31.     
  32.     rs.Close
  33.     Set rs = Nothing
  34.     Set conn = Nothing

  35. End Sub


lString,lTableName:TStrings;


//-----------获取表名信息-------------
lString:=TStringList.Create;
lTableName:=TStringList.Create;
DM_Conn.con_Access.GetTableNames(lString,True);
for i:=0 to lString.Count-1 do
begin
if (lString.Strings[i]<>'MSysACEs')
and (lString.Strings[i]<>'MSysObjects')
and (lString.Strings[i]<>'MSysQueries')
and (lString.Strings[i]<>'MSysRelationships') then
lTableName.Add(lString.Strings[i]);
end;


 Access中Data_type的说名

switch (data_type) {

 //case常量 值 说明
 //case 0x2000
 // :p = AdArray //(不适用于 ADOX。) 0x2000 一个标志值,通常与另一个数据类型常量组合,指示该数据类型的数组。
 case 20: p = "adBigInt 20 指示一个八字节的有符号整数 (DBTYPE_I8)。";
 case 128: p = "adBinary 128 指示一个二进制值 (DBTYPE_BYTES)。";
 case 11: p = "adBoolean 指示一个布尔值 (DBTYPE_BOOL)。";
 case 8: p = "adBSTR 8 指示以 Null 终止的字符串 (Unicode) (DBTYPE_BSTR)。";
 case 136: p = "adChapter 136 指示一个四字节的子集值,标识子行集合中的行 (DBTYPE_HCHAPTER)。";
 case 129: p = "adChar129 指示一个字符串值 (DBTYPE_STR)。";
 case 6: p = "adCurrency 6 指示一个货币值 (DBTYPE_CY)。货币是一个定点数字,小数点右侧有四位数字。该值存储为八字节、范围为 10,000 的有符号整数。";
 case 7: p = "adDate 7 指示日期值 (DBTYPE_DATE)。日期保存为双精度数,数字的整数部分是从 1899 年 12 月 30 日算起的天数,小数部分是一天当中的片段时间。";
 case 133: p = "adDBDate 133 指示日期值 (yyyymmdd) (DBTYPE_DBDATE)。";
 case 134: p = "adDBTime 134 指示时间值 (hhmmss) (DBTYPE_DBTIME)。";
 case 135: p = "adDBTimeStamp 135 指示日期/时间戳(yyyymmddhhmmss 加十亿分之一的小数)(DBTYPE_DBTIMESTAMP)。";
 case 14: p = "adDecimal 14 指示具有固定精度和范围的确切数字值 (DBTYPE_DECIMAL)。";
 case 5: p = "adDouble 5 指示一个双精度浮点值 (DBTYPE_R8)。";
 case 0: p = "adEmpty 0 指定没有值 (DBTYPE_EMPTY)。";
 case 10: p = "adError 10 指示一个 32 位的错误代码 (DBTYPE_ERROR)。";
 case 64: p = "adFileTime 64 指示一个 64 位的值,表示从 1601 年 1 月 1 日开始的 100 个十亿分之一秒间隔的数量 (DBTYPE_FILETIME)。";
 case 72: p = "adGUID 72 指示全局唯一标识符 (GUID) (DBTYPE_GUID)。";
 case 9: p = "adIDispatch 9 指示指向 COM 对象上 IDispatch 接口的指针 (DBTYPE_IDISPATCH)。";
 //注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。 case 3: p = " adInteger 3 指示一个四字节的有符号整数 (DBTYPE_I4)。";
 case 13: p = "adIUnknown 13 指示指向 COM 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN)。";
 //注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。 case 205: p = "adLongVarBinary 205 指示一个长二进制值(仅限于 Parameter 对象)。";
 case 201: p = " adLongVarChar 201 指示一个长字符串值(仅限于 Parameter 对象)。";
 case 203: p = "adLongVarWChar 203 指示一个以 Null 终止的长 Unicode 字符串值(仅限于 Parameter 对象)。";
 case 131: p = "adNumeric 131 指示具有固定精度和范围的确切数字值 (DBTYPE_NUMERIC)。";
 case 138: p = "adPropVariant 138 指示一个 Automation PROPVARIANT (DBTYPE_PROP_VARIANT)。";
 case 4: p = "adSingle 4 指示一个单精度浮点值 (DBTYPE_R4)。";
 case 2: p = "adSmallInt 2 指示一个双字节的有符号整数 (DBTYPE_I2)。";
 case 16: p = "adTinyInt 16 指示一个单字节的有符号整数 (DBTYPE_I1)。";
 case 21: p = " adUnsignedBigInt 21 指示一个八字节的无符号整数 (DBTYPE_UI8)。";
 case 19: p = "adUnsignedInt 19 指示一个四字节的无符号整数 (DBTYPE_UI4)。";
 case 18: p = "adUnsignedSmallInt 18 指示一个双字节的无符号整数 (DBTYPE_UI2)。";
 case 17: p = "adUnsignedTinyInt 17 指示一个单字节的无符号整数 (DBTYPE_UI1)。";
 case 132: p = "adUserDefined 132 指示一个用户定义的变量 (DBTYPE_UDT)。";
 case 204: p = "adVarBinary 204 指示一个二进制值(仅限于 Parameter 对象)。";
 case 200: p = "adVarChar 200 指示一个字符串值(仅限于 Parameter 对象)。";
 case 12: p = "adVariant 12 指示一个 Automation Variant (DBTYPE_VARIANT)。";
 //注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。 case 139: p = "adVarNumeric 139 指示一个数字值(仅限于 Parameter 对象)。";
 case 202: p = "adVarWChar 202 指示一个以 Null 终止的 Unicode 字符串(仅限于 Parameter 对象)。";
 case 130: p = "adWChar 130 指示一个以 Null 终止的 Unicode 字符串 (DBTYPE_WSTR)。";

 }


DELPHI中操作ACCESS数据库(建立.mdb文件,压缩数据库)

以下代码在WIN2K,D6,MDAC2.6下测试通过,
编译好的程序在WIN98第二版无ACCESS环境下运行成功.

//   动态创建.mdb数据库文件 
 procedure   TMainForm.CreateDynamicDatabase(filename:   string); 
 var 
       CreateAccess:   OleVariant; 
 begin 
       CreateAccess   :=   CreateOleObject( 'ADOX.Catalog '); 
       CreateAccess.Create( 'Provider=Microsoft.Jet.OLEDB.4.0;Data   Source= '   +   filename 
             +    ';   Jet   OLEDB:Database   Password=xyz '); 
 end; 
  
 //   创建场地信息表 
 procedure   TMainForm.CreateTableCDXX; 
 begin 
       with   ADOQuery1   do 
       begin 
             Close; 
             SQL.Clear; 
             SQL.Add( 'Create   Table   CDXX( '); 
             SQL.Add( 'CD   char(5)   not   null,    '); 
             SQL.Add( 'RQ   date   not   null,    '); 
             SQL.Add( 'ZSR   money   default   0   not   null,    '); 
             SQL.Add( 'ZZC   money   default   0   not   null,    '); 
             SQL.Add( 'ZYY   money   default   0   not   null,    '); 
             SQL.Add( 'PRIMARY   KEY   (CD)) '); 
             ExecSQL; 
       end; 
 end;

 //在之前uses ComObj,ActiveX
//声明连接字符串
Const
SConnectionString       = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
                              +'Jet OLEDB:Database Password=%s;';

//=============================================================================
// Procedure: GetTempPathFileName
// Author   : ysai
// Date     : 2003-01-27
// Arguments: (None)
// Result   : string
//=============================================================================
function GetTempPathFileName():string;
//取得临时文件名
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(result);
end;

//=============================================================================
// Procedure: CreateAccessFile
// Author   : ysai
// Date     : 2003-01-27
// Arguments: FileName:String;PassWord:string=''
// Result   : boolean
//=============================================================================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//建立Access文件,如果文件存在则失败
var
STempFileName:string;
vCatalog:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
  vCatalog:=CreateOleObject('ADOX.Catalog');
  vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
  result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
  DeleteFile(STempFileName);
except
  result:=false;
end;
end;

//=============================================================================
// Procedure: CompactDatabase
// Author   : ysai
// Date     : 2003-01-27
// Arguments: AFileName,APassWord:string
// Result   : boolean
//=============================================================================
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
  vJE:=CreateOleObject('JRO.JetEngine');
  vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
      format(SConnectionString,[STempFileName,APassWord]));
  result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
  DeleteFile(STempFileName);
except
  result:=false;
end;
end;



 
 
DELPHI对ACCESS表结构操作

- 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIMARY KEY , [字段1] nVarChar(50) default ''默认值'' null , [字段2] ntext null , [字段3] datetime, [字段4] money null , [字段5] int default 0, [字段6] Decimal (12,4) default 0, [字段7] image null , ) 删除表: Drop table [表名] 插入数据: INSERT INTO [表名] (字段1,字段2) VALUES (100,''51WINDOWS.NET'') 删除数据: DELETE FROM [表名] WHERE [字段名]>100 更新数据: UPDATE [表名] SET [字段1] = 200,[字段2] = ''51WINDOWS.NET'' WHERE [字段三] = ''HAIWA'' 新增字段: ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL 删除字段: ALTER TABLE [表名] DROP COLUMN [字段名] 修改字段: ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL 重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表) sp_rename ''表名'', ''新表名'', ''OBJECT'' 新建约束: ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] <= ''2000-1-1'') 删除约束: ALTER TABLE [表名] DROP CONSTRAINT 约束名新建默认值 ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT ''51WINDOWS.NET'' FOR [字段名] 删除默认值 ALTER TABLE [表名] DROP CONSTRAINT 默认值名另外以上的只是SQL的语法在 ACCESS 下大部份也都是一样的项一项查阅,并经自己使用验证,确认在access 数据库中添加自动编号字段使用以下方法比较合适: create table 数据表名称 (id counter constraint primarykey primary key) 需要注意的地方是:第二个primary中间有空格,另外,关键字不区分大小写. 另外自己最近发现的一种方法是: sql="create table mytb (id autoincrement(25,1) primary key,age int)" sql2="create table testtb (id autoincrement,age int,email char, primary key (id))" 其中在access中,autoincrement为自动编号类型字段,(25,1)分别为初始值及步长值,如果不写的话,默认是1,1,primary key指定了主键,以上示例,两种指定方法都可以
 2.ACCESS中使用SQL语句应注意的地方及几点技巧 以下SQL语句在ACCESS XP的查询中测试通过 建表: Create Table Tab1 ( ID Counter, Name string, Age integer, [Date] DateTime); 技巧: 自增字段用 Counter 声明. 字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行. 建立索引: 下面的语句在Tab1的Date列上建立可重复索引 Create Index iDate ON Tab1 ([Date]); 完成后ACCESS中字段Date索引属性显示为 - 有(有重复). 下面的语句在Tab1的Name列上建立不可重复索引 Create Unique Index iName ON Tab1 (Name); 完成后ACCESS中字段Name索引属性显示为 - 有(无重复). 下面的语句删除刚才建立的两个索引 Drop Index iDate ON Tab1; Drop Index iName ON Tab1; ACCESS与SQLSERVER中的UPDATE语句对比: SQLSERVER中更新多表的UPDATE语句: UPDATE Tab1 SET a.Name = b.Name FROM Tab1 a,Tab2 b WHERE a.ID = b.ID; 同样功能的SQL语句在ACCESS中应该是 UPDATE Tab1 a,Tab2 b SET a.Name = b.Name WHERE a.ID = b.ID; 即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后. 上例中如果Tab2可以不是一个表,而是一个查询,例: UPDATE Tab1 a,(Select ID,Name From Tab2) b SET a.Name = b.Name WHERE a.ID = b.ID; 访问多个不同的ACCESS数据库-在SQL中使用In子句: Select a.*,b.* From Tab1 a,Tab2 b In 'db2.mdb' Where a.ID=b.ID; 上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录. 缺点-外部数据库不能带密码. 在ACCESS中访问其它ODBC数据源 下例在ACCESS中查询SQLSERVER中的数据 SELECT * FROM Tab1 IN [ODBC] [ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;] 外部数据源连接属性的完整参数是: [ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;] 其中的DRIVER=driver可以在注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ 中找到 ACCESS支持子查询 ACCESS支持外连接,但不包括完整外部联接,如支持 LEFT JOIN 或 RIGHT JOIN 但不支持 FULL OUTER JOIN 或 FULL JOIN ACCESS中的日期查询 注意:ACCESS中的日期时间分隔符是#而不是引号 Select * From Tab1 Where [Date]>#2002-1-1#; 在DELPHI中我这样用 SQL.Add(Format( 'Select * From Tab1 Where [Date]>#%s#;', [DateToStr(Date)])); ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容, 建议用单引号作为字符串分隔符.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值