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热点文章 |
|
|
|
|
|
|