⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sybdatabase.pas

📁 sybase大全
💻 PAS
字号:
unit sybdatabase;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs,DsgnIntf,sybase32,sybase_components;

type
  SybObjectname = string[30];
  String255     = string[255];

type
  Tsybobjectproperty = class(Tstringproperty)
  public
    procedure GetValues(TheProc: TGetStrProc); override;
    function getattributes:Tpropertyattributes; override;
  end;

type
  TSybDatabase = class(TComponent)
  private
    { Private declarations }
    FUserName    :SybObjectname;
    FDBName      :SybObjectname;
    FPassword    :SybObjectname;
    FServerName  :SybObjectname;
    FLoginPrompt :boolean;
    FServerPrompt:boolean;
    FServerShow  :boolean;
    FShowmessage :boolean;
    FConnected   :boolean;
    FBuffersize  :integer;
    FServerList  :TStrings;
    FDbLibVersion:string;
    FDbVersion   :string;
    fcharset     :SybObjectname;
    fservercharset :SybObjectname;
    flanguage    :SybObjectname;
    fappname     :SybObjectname;
    fhostname    :SybObjectname;
    fdebugfile   :string255;
    Ftimeout     :Integer;
    FLoginTimeOut:Integer;
    procedure SetTimeOut(Value :Integer);
    procedure SetLoginTimeOut(Value :Integer);
    procedure SetUserName(Value :SybObjectname);
    procedure SetPassword(Value :SybObjectname);
    procedure SetDBName(Value :SybObjectname);
    procedure SetServerName(Value :SybObjectname);
    procedure SetLoginPrompt(Value :boolean);
    procedure SetServerPrompt(Value :boolean);
    procedure SetServerShow(Value :boolean);
    procedure SetConnected(Value :boolean);
    procedure SetShowmessage(Value :boolean);
    procedure SetBuffersize(Value :integer);
    procedure SetServerList(Value:TStrings);
    procedure SetCharset(Value:SybObjectname);
    procedure SetLanguage(Value:SybObjectname);
    procedure SetAppName(Value:SybObjectname);
    procedure SetHostName(Value:SybObjectname);
    procedure SetDebugFile(Value:String255);
  protected
    { Protected declarations }
  public
    { Public declarations }
    dbconnected :boolean;
    dbprocc:integer;
    Server,user,pwd,dBase  :array[0..30] of char;
    Login,Retcode,retcode2,nocols,col:integer;
    MsgPointer,ErrPointer,tPointer,Adr:Pointer;
    dbproc:integer;
    servlist    :tstrings;
    constructor create(AOwner:TComponent); override;
    destructor destroy; override;
    procedure setname(const NewName:Tcomponentname); override;
    procedure loaded; override;
    procedure CanQuery;
  published
    { Published declarations }
    procedure connect;
    procedure disconnect;
    procedure get_servers;
    property TimeOut :Integer read FTimeOut write SetTimeOut;
    property LoginTimeOut :Integer read FLoginTimeOut write SetLoginTimeOut;
    property DbLibVersion:string read fdblibversion;
    property ServerCharSet:SybObjectname read fservercharset;
    property CharSet:SybObjectname read fcharset write SetCharset;
    property Language:SybObjectname read flanguage write SetLanguage;
    property AppName:SybObjectname read fappname write SetAppName;
    property HostName:SybObjectname read fhostname write SetHostName;
    property DebugFile:string255 read fdebugfile write SetDebugFile;
    property DBVersion:string read fdbversion;
    property Password :SybObjectname read FPassword write SetPassword;
    property UserName :SybObjectname read FUserName write SetUserName;
    property DBName :SybObjectname read FDBName write SetDBName;
    property ServerName :SybObjectname read FServerName write SetServerName;
    property LoginPrompt :boolean read Floginprompt write Setloginprompt default True;
    property ServerPrompt :boolean read FServerPrompt write SetServerPrompt default True;
    property ServerShow :boolean read FServerShow write SetServerShow default True;
    property Connected :boolean read FConnected write SetConnected stored false;
    property ShowMessage :boolean read Fshowmessage write Setshowmessage default false;
    property BufferSize :integer read FBuffersize write SetBuffersize;
    property ServerList:TStrings read FServerList write FServerList; //SetServerList;
  end;

procedure Register;

var from_create :boolean;

implementation
uses objectlistdlg,
     sybaselogin,
     sybquery;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(SybObjectname),TSybDatabase,'DBName',TsybobjectProperty);
  RegisterPropertyEditor(TypeInfo(SybObjectname),TSybDatabase,'ServerName',TsybobjectProperty);
  RegisterComponents('Sybase DBLIB', [TSybDatabase]);
end;

constructor TSybDatabase.create(AOwner:TComponent);
var p:pointer;
begin
  inherited create(AOwner);
  ErrPointer := MakeProcInstance(GetProcAddress(0,'Errors'),hInstance);
  MsgPointer := MakeProcInstance(GetProcAddress(0,'Messages'),hInstance);
  dbmsghandle(addr(syb_messages));
  dberrhandle(addr(errors));
  Floginprompt:=True;
  Fserverprompt:=True;
  Fservershow:=True;
  FConnected:=False;
  dbConnected:=False;
  FDBName:='master';
  FBuffersize:=0;
  fdblibversion:='';
  fdbversion:='';
  fcharset:='';
  fservercharset:='';
  from_create:=true;
  if FirstDatabase = 0 then
  begin
    DatabasesList:= TList.Create;
    FirstDatabase:=1;
  end;

  fserverlist:=tstringlist.create;
  servlist:=tstringlist.create;
  get_servers;
  setserverlist(servlist);
end;

destructor TSybDatabase.destroy;
var i :integer;
begin
  databaseslist.remove(self);
  FServerList.Free;
  ServList.Free;
  
  inherited destroy;
end;

procedure TSybDatabase.loaded;
begin
  inherited loaded;
  setserverlist(servlist);
end;

procedure TSybDatabase.setname(const NewName:Tcomponentname);
var oldname   :Tcomponentname;
    i         :integer;
    adatabase :tsybdatabase;
begin
  oldname:=name;
  inherited setname(NewName);

  if databaseslist.indexof(self) = -1 then
    databaseslist.add(self)
  else
  begin
    databaseslist.items[databaseslist.indexof(self)]:=self;
  end;
end;

procedure TSybDatabase.SetCharset(Value:SybObjectname);
begin
  fCharset:=value;
end;

procedure TSybDatabase.SetLanguage(Value:SybObjectname);
begin
  fLanguage:=value;
end;

procedure TSybDatabase.SetAppName(Value:SybObjectname);
begin
  fappname:=value;
end;

procedure TSybDatabase.SetHostName(Value:SybObjectname);
begin
  fhostname:=value;
end;

procedure TSybDatabase.SetDebugFile(Value:String255);
begin
  fdebugfile:=value;
end;

procedure TSybDatabase.SetServerList(Value :TStrings);
begin
  FServerList.assign(Value);
end;

procedure TSybDatabase.SetUserName(Value :SybObjectname);
begin
  FUserName:=Value;
end;

procedure TSybDatabase.SetDBName(Value :SybObjectname);
begin
  FDBName:=Value;
  strpcopy(dbase,fdbname);
  Retcode := dbuse(dbProc,@dBase);
end;

procedure TSybDatabase.SetServerName(Value :SybObjectname);
begin
  FServerName:=Value;
end;

procedure TSybDatabase.SetBuffersize(Value :integer);
var p :pchar;
    s :string[20];
begin
  FBuffersize:=Value;
  s:=inttostr(value);
  new(p);
  strpcopy(p,s);
  if (Value > 0)
    and (connected) then
  begin
    retcode:=dbsetopt(dbproc,DBBUFFER,p,-1);
  end;
  dispose(p);
end;  

procedure TSybDatabase.SetPassword(Value :SybObjectname);
begin
  FPassword:=Value;
end;

procedure TSybDatabase.SetLoginPrompt(Value :boolean);
begin
  FLoginPrompt:=Value;
end;

procedure TSybDatabase.SetServerPrompt(Value :boolean);
begin
  FServerPrompt:=Value;
end;

procedure TSybDatabase.SetServerShow(Value :boolean);
begin
  FServerShow:=Value;
end;

procedure TSybDatabase.Setshowmessage(Value :boolean);
begin
  Fshowmessage:=Value;
end;

procedure TSybDatabase.SetConnected(Value :boolean);
begin
  if not Fconnected then
    connect
  else
    disconnect;
end;

procedure TSybDatabase.connect;
var
  usernm      :pchar;
  PasswordDlg :TPasswordDlg;
  q           :tsybquery;

  the_set    :array[0..30] of char;
  the_file   :array[0..255] of char;

begin
  if Fconnected then
    exit;
  if length(FDBName) = 0 then
    FDBName:='master';
  passworddlg:=TPasswordDlg.create(nil);
  if loginprompt then
  begin
    if length(FServerName) > 0 then
      passworddlg.caption:='Login to ' + FServerName;
    if not FServerPrompt then
      passworddlg.server.enabled:=false;

    if not FServerShow then
    begin
      passworddlg.server.visible:=false;
      passworddlg.label3.visible:=false;
      passworddlg.username.top:=9;
      passworddlg.username.left:=84;
      passworddlg.password.top:=43;
      passworddlg.password.left:=84;
      passworddlg.label2.top:=17;
      passworddlg.label1.top:=49;
      passworddlg.label1.left:=20;
      passworddlg.label2.left:=36;
      passworddlg.bevel1.height:=73;
      passworddlg.height:=140;
      passworddlg.okbtn.top:=82;
      passworddlg.cancelbtn.top:=82;
    end;

    passworddlg.username.text:=FUserName;
    passworddlg.password.text:=FPassword;
    passworddlg.Server.text:=FServerName;
    passworddlg.server.items:=fserverlist;
    passworddlg.showmodal;
    if passworddlg.modalresult = mrcancel then
    begin
      FConnected:=false;
      dbConnected:=false;
      exit;
    end;
    FUserName:=passworddlg.username.text;
    FPassword:=passworddlg.password.text;
    FServerName:=passworddlg.server.text;
  end;
  passworddlg.free;

  FConnected:=false;
  dbConnected:=false;

  if (passworddlg.modalresult = mrok)
    or (not loginprompt) then
  begin
    strpcopy(User,UserName);
    strpcopy(Pwd,Password);
    StrpCopy(Server,ServerName);
    StrpCopy(dBase,DBName);
    dbinit;
    login := dblogin;

//     1 - Host Name
//      2 - User Name
//      3 - Password
//      4 - Don't know yet
//      5 - Application Name
//      6 - Don't know yet
//      7 - Default Language
//      10 - Default Charcter Set

    if length(hostname)>0 then
    begin
      strpcopy(the_set,hostname);
      Retcode := dbsetlname(login,@the_set,1);
    end;
    Retcode := dbsetlname(login,@User,2);
    Retcode := dbsetlname(login,@Pwd,3);
    if length(appname)>0 then
    begin
      strpcopy(the_set,appname);
      Retcode := dbsetlname(login,@the_set,5);
    end;
    if length(language)>0 then
    begin
      strpcopy(the_set,language);
      Retcode := dbsetlname(login,@the_set,7);
    end;
    if length(charset)>0 then
    begin
      strpcopy(the_set,charset);
      Retcode := dbsetlname(login,@the_set,10);
    end;
    if length(debugfile)>0 then
    begin
      strpcopy(the_file,debugfile);
      dbrecftos(@the_file);
    end;
    Retcode:=dbSetlBool(Login, 1, 6);
    dbProc := dbopen(login,server);
    If dbProc <> 0 then
    Begin
      retcode:=dbuse(dbProc,@dBase);
      FConnected:=true;
      dbConnected:=true;
      dbprocc:=dbproc;
      setbuffersize(buffersize);
      fdblibversion:=dbversion;
      fcharset:=dbgetcharset(dbproc);
      fservercharset:=dbservcharset(dbproc);
      fLanguage:=dbgetnatlang(dbproc);

      q:=tsybquery.create(nil);
      q.AutoDbProc:=false;
      q.dbproc:=dbprocc;
      q.dbname:=name;
      q.sql:='select @@version';
      q.sqlexec;
      while q.nextrow = -1 do
      begin
        fdbversion:=q.column(1);
      end;
      q.free;

      if databaseslist.indexof(self) = -1 then
        databaseslist.add(self)
      else
        databaseslist.items[databaseslist.indexof(self)]:=self;
    end
    else
    begin
      FConnected:=false;
      dbConnected:=false;
    end;
  end
  else
  begin
    FConnected:=false;
    dbConnected:=false;
  end;
  if not FConnected then
  begin
    MessageBox(GetActiveWindow,'Could not login to Server','DB-Library error',mb_ok+mb_iconexclamation);
    FConnected:=false;
    dbConnected:=false;
  end;
  dbloginfree(login);

end;

procedure TSybDatabase.disconnect;
begin
  if Fconnected then
  begin
    FConnected:=false;
    dbConnected:=false;
    dbclose(dbProc);
{    dbexit;}
  end;
end;

procedure Tsybobjectproperty.GetValues(TheProc: TGetStrProc);
var
  SqlCommand:array[0..2048] of char;
  Login,Retcode,retcode2:integer;
  dbname :SybObjectname;
  proc,i :integer;
  tslist :tsybdatabase;
begin
  tslist:=tsybdatabase(getcomponent(0));
  proc:=tslist.dbproc;

  if getname='ServerName' then
  begin
    for i:=0 to tslist.fserverlist.count-1 do
      theproc(tslist.fserverlist[i]);
  end;

  if getname='DBName' then
  begin
    if tslist.dbconnected then
    begin
      strpcopy(Sqlcommand,'select name from master..sysdatabases');
      Retcode := dbcmd(Proc,@Sqlcommand);
      Retcode := Dbsqlexec(Proc);
      Retcode := dbresults(Proc);
      retcode2:=0;
      while (retcode <> No_more_results) and (retcode <> Fail) do
      begin
        if retcode = Succeed then
        begin
          retcode2 := dbnextrow(Proc);
          while retcode2 <> No_More_Rows do
          Begin
            theproc(strpas(dbvalue(proc,1)));
            retcode2 := dbnextrow(Proc);
          end;
        end;
        Retcode := dbresults(proc);
      end;
    end;  
  end;

  strpcopy(tslist.dbase,getstrvalue);
  retcode:=dbuse(Proc,@tslist.dbase);
end;

function Tsybobjectproperty.getattributes:Tpropertyattributes;
begin
  Result := [paValueList,paAutoUpdate,paMultiSelect];
end;

procedure TSybDatabase.get_servers;
var sybase_dir  :array[0..255] of char;
    fin         :textfile;
    l           :string[30];
    l2          :string[1];
begin
    GetEnvironmentVariable('SYBASE',sybase_dir,sizeof(sybase_dir));
    l:=string(sybase_dir) + '\INI\SQL.INI';
    try
    assignfile(fin,l);
    {$i-} reset(fin) {$i+};
    if (ioresult=0) then
    begin

      while not eof(fin) do
      begin
        readln(fin,l);
        l2:=l;
        if l2='[' then
        begin
          ServList.add(copy(l,2,length(l)-2));
        end;
      end;
    end;
    finally
    {$i-} closefile(fin) {$i+};
    end;
end;

procedure TSybDatabase.CanQuery;
begin
  Dbcanquery(dbProcc);
end;

procedure TSybDatabase.SetLoginTimeOut(Value: Integer);
var retcode   :Integer;
begin
  retcode:=dbsetlogintime(Value);
  FLoginTimeOut:=Value;
end;

procedure TSybDatabase.SetTimeOut(Value: Integer);
var retcode   :Integer;
begin
  retcode:=dbsettime(Value);
  FTimeOut:=Value;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -