中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>开发应用>文章内容

delphi 运行时执行所有Interbase命令的Interbase 对象

来源:站内 关于:bill 发布时间:2007-06-22   [收藏] [推荐]
摘 要:如何在运行时生成Interbase对象?何不使用Interbase工具就改变Interbase数据库的密码/用户名?
关键字:对象 数据库 建立 控件
类 别:数据库
    如果应用程序使用Interbase数据库,数据库和全部所需的对象如:如函数,存储过程等必须在运行之前创建。

    有一部分命令如:改变管理员的用户名和密码必须通过Interbase的Server manager或Interbase的命令行工具。

        通过在项目中包含此单元,你可以执行所有所需的命令如新建数据库,改变管理员密码,建立shadow,函数,过程等等。

    要确保程序中已建立此对象。在项目源文件中"Object_Interbase"单元必须是程序使用的标准单元后的第一个单元。

    把Object_Interbase包含入你的uses子句中去。你会得到TmyIbDataBase类的名为"ThisDataBase"的变量,我们将用它来Interbase 执行Interbase命令。

//*** 单元开始
 unit Object_Interbase;

interface

Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
     Dialogs, Registry, IBDataBase, IBQuery, FileCtrl;

Type
    TShadow = ( stManual, stAuto, stConditional );
    
    TMyIbDataBase = Class( TObject )
       private
          //用户定义类型变量

          FShdType : TShadow;

          //部件变量
          FDataBase : TIBDatabase;
          FTransaction : TIBTransaction;
          FQuery : TIBQuery;

          //布尔变量
          FUseDefaultFiles : Boolean;
          FConnected : Boolean;
          FShadow : Boolean;

          //字符串变量
          FIBServerPath : String;
          FDataBasePath, FShadowPath : String;
          FUser, FPassword : String;
          FDatabaseName : String;

          //过程
          Procedure CheckDirPath( Var Value : String );
          Procedure ChangetoIBDir;
          Procedure CreateComponents;
          Procedure InitilizeVariables;
          Procedure IBLoadpathfromRegistry;
          Procedure SetDataBasePath( Value : String );
          Procedure SetShadowPath( Value : String );
          Procedure SetAdminName( Value : String );
          Procedure SetAdminPassword( Value : String );
          Procedure SetDatabaseName ( Value : String );
          Procedure SetShadow( Value : Boolean );
          Procedure SetShadowType( Value : TShadow );
       protected
       public
          Constructor Create;
          
          //过程
          Procedure IBCreateDatabase;
          Procedure IBConnectToDatabase;          
          Procedure IBDisConnecFromDatabase;          
          Procedure IBCreateShadow;
          Procedure IBQueryAssisnSQL( Value : String; CloseAfterExecution : Boolean );
          Procedure IBChangeAdminPassword( Value : String );
                      
          //部件属性
          property IBAppDatabase : TIBDatabase Read FDataBase;
          property IBAppTransaction : TIBTransaction Read FTransaction;
          property IBAppQuery : TIBQuery Read FQuery;

          //用户定义类型变量
          property IBShadowType : TShadow Read FShdType Write SetShadowType;

          //布尔值属性
          property IBConnected : Boolean Read FConnected Default False;
          property IBExists : Boolean Read FUseDefaultFiles Default False;
          property IBShadow : Boolean Read FShadow Write SetShadow Default False;

          //字符串值属性
          property IBServerPath : String Read FIBServerPath;
          property IBUserName : String Read FUser Write SetAdminName;
          property IBPassword : String Read FPassword Write SetAdminPassword;
          property IBDatabasePath : String Read FDataBasePath Write SetDataBasePath;
          property IBShadowPath : String Read FShadowPath Write SetShadowPath;
          property IBDatabaseName : String Read FDatabaseName Write SetDatabaseName;
    End;                                                    

Var
    ThisDataBase : TMyIbDataBase;


    
implementation


{ TIbDataBase }

Procedure TMyIbDataBase.CheckDirPath( Var Value : String );
Begin
    If Value[Length(Value)] <> ''\'' then Value := Value + ''\'';
    If not DirectoryExists( Value ) then begin
       CreateDir( Value );
    End;
End;

Procedure TMyIbDataBase.IBChangeAdminPassword( Value : String );
Var I : Integer;
Begin
    ThisDataBase.ChangetoIBDir;
    I := WinExec( pchar(''gsec -user '' + ThisDataBase.IBUserName +
                        '' -password '' + ThisDataBase.IBPassword +
                        '' -mo '' + ThisDataBase.IBUserName  + '' -pw '' +
                        Value ), 0 );
    ThisDataBase.IBPassword := Value;
End;

Procedure TMyIbDataBase.ChangetoIBDir;
Begin
    If ThisDataBase.IBExists then ChDir( ThisDataBase.IBServerPath );
End;

Procedure TMyIbDataBase.IBConnectToDatabase;
Begin
  If not ThisDataBase.IBConnected then begin
       FDataBase.Close;
       FDataBase.SQLDialect := 1;
       FTransaction.Active := False;
       FQuery.Close;
       FDataBase.LoginPrompt := False;
       FDataBase.Params.Clear;
       FDataBase.Params.Add( ''USER_NAME='' + ThisDataBase.IBUserName );
       FDataBase.Params.Add( ''PASSWORD='' + ThisDataBase.IBPassword );
       FDataBase.DatabaseName := ThisDataBase.IBDatabasePath + IBDatabaseName;
       Try
         FDataBase.Connected := True;
         FTransaction.DefaultDatabase := FDataBase;
       Except
       End;  
       FConnected := FDataBase.Connected;
       FQuery.Transaction := FTransaction;
       FQuery.Database := FDataBase;
       FDataBase.DefaultTransaction := FTransaction;
       If FConnected then begin
          FTransaction.Active := True;
       End;
  End;    
End;

constructor TMyIbDataBase.Create;
Begin
    CreateComponents;
    InitilizeVariables;
    IBLoadpathfromRegistry;
End;

Procedure TMyIbDataBase.CreateComponents;
Begin
    FDataBase := TIBDatabase.Create( Application );
    FTransaction := TIBTransaction.Create( Application );
    FDataBase.DefaultTransaction := FTransaction;
    FTransaction.DefaultDatabase := FDataBase;
    FQuery := TIBQuery.Create( Application );
    FQuery.Database := FDataBase;
    FQuery.Transaction := FTransaction;
    FQuery.ParamCheck := False;
End;

Procedure TMyIbDataBase.IBCreateDatabase;
Var vmem : TStringList;
    S : String;
Begin
    S := ExtractFilePath( Application.ExeName );
    vmem := TStringList.Create;
    vmem.Add( ''Create database "'' + ThisDataBase.IBDatabasePath + ThisDataBase.IBDatabaseName +
              ''" user "'' + ThisDataBase.IBUserName + ''" password "'' +
              ThisDataBase.IBPassword + ''" page_size=2048 Length=50;'');
    vmem.Add( ''Commit work;'' );
    vmem.Add( ''gfix -w "sync" -user "'' + ThisDataBase.IBUserName + ''" -pa '' +
               ThisDataBase.IBPassword + ''" "'' + ThisDataBase.IBDatabasePath +
               ThisDataBase.IBDatabaseName + ''"'' );
    S := S + ''Sql03EASY05.Sql'';
    vmem.SaveToFile( S );
    vmem.Free;
    ThisDataBase.ChangetoIBDir;
    S := ''isql -input '' + S;
    winexec( pchar( S ),0 );
    DeleteFile( S );
    S := ThisDataBase.IBDatabasePath + ThisDataBase.IBDatabaseName;
    while not FileExists( S ) do;
    ThisDataBase.IBConnectToDatabase;
    FConnected := FDataBase.Connected;
End;

Procedure TMyIbDataBase.IBCreateShadow;
Var S, vFname : String;
Begin
    If ThisDataBase.IBConnected then begin
       Case FShdType of
            stAuto        : S := ''Auto'';
            stManual      : S := ''Manual'';
            stConditional : S := ''Conditional'';
       End;  
       vFname := Copy( FDatabaseName, 1,  pos( ''.'', FDatabaseName ) ) + ''Shd'';
       FQuery.Close;
       FQuery.SQL.Clear;
       FQuery.SQL.Text := ''Create Shadow 1 '' + S + '' "'' + FShadowPath +
                          vFname + ''" Length = 10000'';
       FQuery.ExecSQL;          
       Application.ProcessMessages;          
    End;
End;

Procedure TMyIbDataBase.InitilizeVariables;
Begin
    FDataBasePath := '''';
    FShadowPath := '''';
    FIBServerPath := '''';
    FUser := '''';
    FPassword := '''';
    FDatabaseName := '''';
    FShdType := stConditional;
    FConnected := False;
End;

Procedure TMyIbDataBase.IBLoadpathfromRegistry;
Var vReg : TRegistry;
Begin
    vReg := TRegistry.Create;
    vReg.RootKey := HKEY_LOCAL_MACHINE;
    If vReg.OpenKey( ''\Software\InterBase Corp\InterBase\CurrentVersion'', False ) then begin
       FIBServerPath := vreg.ReadString( ''ServerDirectory'' );
       FUseDefaultFiles := True;
    End else begin
       FIBServerPath := ExtractFilePath( Application.ExeName );
       FUseDefaultFiles := False;
    End;  
    vReg.CloseKey;
    vReg.Free;
End;

Procedure TMyIbDataBase.SetAdminName(Value: String);
Begin
    If ( Value <> FUser ) then FUser := Value;
End;

Procedure TMyIbDataBase.SetAdminPassword(Value: String);
Begin
    If ( Value <> FPassword ) then FPassword := Value;
End;

Procedure TMyIbDataBase.SetDatabaseName(Value: String);
Begin
    If ( Value <> FDatabaseName ) then FDatabaseName := Value;
End;

Procedure TMyIbDataBase.SetDataBasePath( Value: String );
Begin
    If ( Value <> FDataBasePath ) then begin
        FDataBasePath := Value;
        CheckDirPath( FDataBasePath );
    End;
End;

Procedure TMyIbDataBase.SetShadow(Value: Boolean);
Begin
    If ( Value <> FShadow ) Then FShadow := Value;
End;

Procedure TMyIbDataBase.SetShadowPath( Value: String );
Begin
    If ( Value <> FShadowPath ) then begin
        FShadowPath := Value;
        CheckDirPath( FShadowPath );
    End;
End;

Procedure TMyIbDataBase.SetShadowType(Value: TShadow);
Begin
    If ( Value <> FShdType ) then FShdType := Value;
End;

Procedure TMyIbDataBase.IBQueryAssisnSQL( Value : String; CloseAfterExecution: Boolean);
Begin

    FQuery.Close;
    FQuery.SQL.Clear;
    FQuery.SQL.Text := Value;
    try
        FQuery.ExecSQL;
    except
    End;
    if CloseAfterExecution then begin
       FQuery.Close;
       FQuery.SQL.Clear;
       FQuery.SQL.Text := ''Commit'';
       FQuery.ExecSQL;
       FQuery.Close;  
    end;
End;

procedure TMyIbDataBase.IBDisConnecFromDatabase;
begin
    FDataBase.CloseDataSets;
    FDataBase.ForceClose;
    FConnected := FDataBase.Connected;
end;

Initialization
    If ( ThisDataBase = NIL ) then ThisDataBase := TMyIbDataBase.Create;
Finalization
    If ( ThisDataBase <> NIL ) then begin
        ThisDataBase.Free;
        ThisDataBase := NIL;
    End;  
End.

//** 单元结束

例子:
---------

1.新建数据库

    如果你要在名为"c:\test\"的目录下使用管理员名字"LION"和密码"king"来新建一称为"Sample.Gdb"的数据库,只要使用本简单对象的属性和方法,我们就可以创建数据库。

ThisDataBase.IBUserName := ''LION'';
ThisDataBase.IBPassword := ''king'';
ThisDataBase.IBDatabasePath := ''c:\test\'';
ThisDataBase.IBDatabaseName := ''Sample.Gdb'';
ThisDataBase.IBCreateDatabase;

    属性IBUserName, IBPassword, IBDatabaseName只能斌值一次。

2.新建Shadow

ThisDataBase.IBConnectToDatabase;
ThisDatabse.IBShadowType := stAuto;
ThisDatabse.IBCreateShadow;

3.改变数据库密码

ThisDataBase.IBChangeAdminPassword( ''NewPassword'' );

4.新建数据表

ThisDatabase.IBQueryAssisnSQL( ''CREATE TABLE USERS(                    '' +
                               ''USERCODE      VARCHAR(6)  NOT NULL   , '' +
                               ''USERNAME      VARCHAR(20) NOT NULL   , '' +
                               ''USERACTIVE    VARCHAR(1)  DEFAULT "Y", '', True );    


    用同样的方法你可以为确定存储过程、函数,或为建立所有使用本方法的对象而定出脚本。

5. 属性IBAppDatabase, IBAppTransaction and IBAppQuery可用于对IBTable部件斌值,如果你要使用此部件。

    万一你不再使用Interbase部件,可以修改本对象使之能和简单数据库部件一起工作。

[浏览: 次]   
上一篇:delphi 在Oracle存储过程中得到数据库   下一篇:delphi 开发网络数据库应用
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_三谈多态——善用virtua
·delphi 条形码处理
·delphi Delphi_三层开发基本概念介绍
·delphi 汉字转拼音码(上)
·delphi Olevariant
·delphi CS构架下的客户端自动更新程序
·delphi 在Dephi中使用TStream读写数据
·delphi 汉字转拼音码(下)
·delphi delphi处理流
·delphi 关于使用COM对象的方法
·delphi MTS组件——从理论到实践
·delphi 汉字转拼音码(中3)
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932