Arsip: Tips : Menampilkan Dialog Koneksi

 
user image
more 18 years ago

cyber_hecker

permisi.... gue orangnya pelupa banget.. jadi suka nyimpen data atau listing yang mungkin sering gue pake di internet. jadi hari ini saya mo minjem thread di sini satu yach :P. menampilkan kotak dialog Connection ADO :
procedure TCallingForm.btnConnectClick(Sender: TObject);
begin
  //Just testing
  PromptDataSource(Handle, Memo1.Text);
end;
listing singkat di atas berfungsi untuk menampilkan kotak koneksi. jangan di hapus ya admin yang baik. wakakaka :D
user image
more 18 years ago

DonVall

Tapi suka lambat saat pertama kali dipanggil. Lalu user suka bingung milih dari sekian banyak db engine yang terinstall. Mending buat dialog pemilihan ADO koneksi yang customized, seperti yang khusus MS Access misalnya atau khusus MS SQL Server (untuk ini tips dan trik buat dapetin daftar server MS SQL bakalan berguna sekali). Buat dia se-independent mungkin, simpen baik2, baru tinggal dipake di proyek2 berikutnya. ATau boleh lah dibagi ke aku! ;D
user image
more 18 years ago

deLogic

jangan lupa tambahkan unit ADODB pada klausul uses. syntax lengkap: ADODB.PromptDataSource(Handle, InitialString)
user image
more 18 years ago

cyber_hecker

wakakaka :D.. sial neh... gara-gara katanya kurang flexsibel.. terpaksa deh jatah tidur siang ku ku potong 1 jam untuk mbikin costumize dialog koneksi khusus SQL Server 2000. setelah bebepa kali nyoba.. jadi deh. walau mungkin masih banyak penangganan error yang kurang bagus. kalo bisa seh di perbaiki deh ama senior-senior yang lain wakakaka :D
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DB, ADODB, Grids, DBGrids;
type
  TFKoneksiMSSever = class(TForm)
    adoList: TADOQuery;
    edUser: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    cboDatabase: TComboBox;
    optSecurity: TRadioGroup;
    Label3: TLabel;
    Label4: TLabel;
    cboServer: TComboBox;
    edPass: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure cboServerChange(Sender: TObject);
    procedure optSecurityClick(Sender: TObject);
  private
    { Private declarations }
    function GetConn : WideString;
    procedure ListServer(vServer: TStrings);
  public
    { Public declarations }
  end;
var
  FKoneksiMSSever: TFKoneksiMSSever;
implementation
{$R *.dfm}
uses ActiveX, ComObj, AdoInt, OleDB;
{ TForm1 }
{ -- credit ---------------------------------------------------------
  thanks to
  www.delphi.about.com -  Zarko Gajic
  prosedur untuk mendapatkan list server dari Ms SQL Server 2000
  ----------------------------------------------------------------- }
procedure TFKoneksiMSSever.ListServer(vServer: TStrings);
var
  RSCon: ADORecordsetConstruction;
  Rowset: IRowset;
  SourcesRowset: ISourcesRowset;
  SourcesRecordset: _Recordset;
  SourcesName, SourcesType: TField;
    function PtCreateADOObject(const ClassID: TGUID): IUnknown;
    var
      Status: HResult;
      FPUControlWord: Word;
    begin
      asm
        FNSTCW FPUControlWord
      end;
      Status := CoCreateInstance(
                  CLASS_Recordset,
                  nil,
                  CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
                  IUnknown,
                  Result);
      asm
        FNCLEX
        FLDCW FPUControlWord
      end;
      OleCheck(Status);
    end;
begin
  SourcesRecordset := PtCreateADOObject(CLASS_Recordset) as _Recordset;
  RSCon := SourcesRecordset as ADORecordsetConstruction;
  SourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
  OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));
  RSCon.Rowset := RowSet;
  with TADODataSet.Create(nil) do
  try
    Recordset := SourcesRecordset;
    SourcesName := FieldByName('SOURCES_NAME'); { do not localize }
    SourcesType := FieldByName('SOURCES_TYPE'); { do not localize }
    vServer.BeginUpdate;
    try
      while not EOF do
      begin
        if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and (SourcesName.AsString <> '') then
          vServer.Add(SourcesName.AsString);
        Next;
      end;
    finally
      vServer.EndUpdate;
    end;
  finally
    Free;
  end;
end;
procedure TFKoneksiMSSever.FormCreate(Sender: TObject);
begin
  optSecurityClick(optSecurity);
  ListServer(cboServer.Items);
end;
function TFKoneksiMSSever.GetConn: WideString;
begin
  // milih koneksi apa pake password atau yang enggak
  case optSecurity.ItemIndex of
    0 : begin
          Result :=
            'Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
            'Persist Security Info=False;Data Source='+cboServer.Text;
        end;
    1 : begin
          Result :=
            'Provider=SQLOLEDB.1;Password='+edPass.Text+
            ';Persist Security Info=True;User ID='+edUser.Text+
            ';Data Source='+cboServer.Text;
        end;
  end;
end;
{ -- credit ---------------------------------------------------------
  thanks to
  www.swissdelphicenter.ch -  Mostafa Sarbazzadeh
  prosedur untuk mendapatkan list dari database SQL Server 2000
  ----------------------------------------------------------------- }
procedure TFKoneksiMSSever.cboServerChange(Sender: TObject);
begin
  cboDatabase.Clear;
  with adoList do
  begin
    ConnectionString := GetConn;
    SQL.Clear;
    SQL.Append('Exec SP_DATABASES');
    try
      Open;
      cboDatabase.Clear;
      repeat
        cboDatabase.Items.Append(Fields[0].AsString);
        Next;
      until adoList.Eof;
      Close;
    except
      on e:exception do
        MessageDlg(e.Message,mtError, [mbOK],0);
    end;
  end;
end;
procedure TFKoneksiMSSever.optSecurityClick(Sender: TObject);
begin
  case optSecurity.ItemIndex of
    0 : begin
         edUser.Enabled := False;  edPass.Enabled := False;
        end;
    1 : begin
         edUser.Enabled := True;  edPass.Enabled := True;
         edUser.SetFocus;
        end;
  end;
end;
end.
user image
more 18 years ago

DonVall

Hebat, hebat! Gak sia2 aku ngomporin. Emang lagi butuh juga nih! Hehehehehe... thanks sebelumnya! Kirimin dong source codenya langsung. Soalnya dfm-nya kan gak ada nih! Tar kalo ada yang bisa diimpove kita improve dah!
user image
more 18 years ago

cyber_hecker

untuk source code nya udah ku masukkan dalam onDownload malam ini. tapi gak tau tuh kapan admin-nya bakal aprove wakakaka :D. sabar aja yach...
user image
more 18 years ago

DonVall

Wehehe... pake minta bayaran lagi........... ok, aku bayar ke community ya!!! aku lagi bayang2in artikel tentang bikin "customized db aware control". Maksudnya biar bisa belajar gimana membuat kontrol yang db aware. Kebetulan di proyek yang aku lagi kerjain aku terpaksa membuatnya. Hehehe.... Mengenai source code, ini ada kritik:

procedure TFKoneksiMSSever.cboServerChange(Sender: TObject);
begin
  cboDatabase.Clear;  <--- ini diulang lagi di bawah
  with adoList do
  begin
    ConnectionString := GetConn;
    SQL.Clear;
    SQL.Append('Exec SP_DATABASES');
    try
      Open;
      //cboDatabase.Clear;  <-- ini dihapus aja, ngapain 2 kali???
      repeat
        cboDatabase.Items.Append(Fields[0].AsString);
        Next;
      until adoList.Eof;
      Close;
    except
      on e:exception do
        MessageDlg(e.Message,mtError, [mbOK],0);
    end;
  end;
end;
Lalu tambahkan property yang memberikan koneksi string dari informasi yang sudah diberikan oleh user. Ini kayaknya udah diberikan oleh function GetConn, jadi sebenarnya tinggal deklarasikan read-only property yang metode bacanya GetConn. Kayak gini:

  TFKoneksiMSSever = class(TForm)
    ...
    ...
    ..
  public
    Property ConnectionString: WideString Read GetConn;
  End;
Trus, kode berikut bisa di-rework,
procedure TFKoneksiMSSever.optSecurityClick(Sender: TObject);
begin
  case optSecurity.ItemIndex of
    0 : begin
         edUser.Enabled := False;  edPass.Enabled := False;
        end;
    1 : begin
         edUser.Enabled := True;  edPass.Enabled := True;
         edUser.SetFocus;
        end;
  end;
end;
jadi:
procedure TFKoneksiMSSever.optSecurityClick(Sender: TObject);
begin
  edUser.Enabled := optSecurity.ItemIndex=1;
  edPass.Enabled := optSecurity.ItemIndex=1;
  If edUser.Enabled Then edUser.SetFocus;
end;
Trus, ada satu fungsi yang belum ditambahin, i.e. "Tes Koneksi". Hmmm.. buat apa di-test koneksi? Kan udah bisa tampilin daftar database-nya? Berarti udah punya akses dong usernya ke server! Akses ke server mungkin si user udah ada. Tapi akses ke database belum tentu! Di sini gunanya fungsi "Tes Koneksi" ini. Apa user yang login (baik yang info-nya diambil dari login windows atau yang diberitahukan username dan password-nya) punya akses ke server dan database yang dimaksud. Keep up the good work, man!!!
user image
more 18 years ago

cyber_hecker

weks :opss: malah pinter kamu neh.. jadi pengen malu. ya udah DonVall, dikembangin aja jadi dbaware. klo gue sih ngaku, seumur hidup gak tau cara bikin yang namanya komponen. wakakaka :P jadi maklum aja klo tentang komponen gue angkat tangan. wakakaka :D
more ...
  • Pages:
  • 1
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com