반응형

개인 컨텐츠로 제작 중인 프로그램


DB서버 = MSSQL 2012

유저수 : 300명

수집 내용 : 주소,이름,날짜

클라이언트 프로그램  목적 : 파일 검색기

클라이언트 프로그램 개발 툴 : 델파이 xe3

클라이언트 프로그램과 DB 연결 방법 : ADO 연결 2 tier(델파이 xe2 db express와 mssql 2012간의 호환성 문제가 있어서 연결이 안됨)

원격 DB클라이언트 툴: SQuirreL SQL Client


사용자의 PC하드디스크의 파일들을 검색하여 MD5정보와 파일명,사이즈등을 프로그램 grid에 담는다.(MD5 HASH 기법)

MD5는 파일 사이즈가 1gb가 이상일 경우 평균 파일 하나당 일반 SATA3 7200RPM 하드의 경우 몇초씩 소요되서 검색이 느리다.

그렇기 때문에 파일의 앞 10000 kbyte 중간 100000 kbytte 끝 100000 kbyte로 파일 부분적으로 스트림을 통해 끊어 합친 후에 md5처리를 할 경우 현저히 속도가 빨라진다.

유명 파일 중복 검사 툴등이 빠른 검색 서비스로 사용하는 방법이기도 하다.


파일명으로 검색하는 것은 파일명이 조금이라도 틀리거나 특수기호 및 여러 문제 때문에 100% 신뢰성이 없다., 이름 검색을 통해서 중복된 데이터는 사용자가 직접

컨텐츠를 찾아 선택하게 되면 해다 MD5의 컨텐츠가 DB 테이블 상에 등록된다.


문제점으로는 사용자가 잘못 컨텐츠를 선택 시에도 반영이 되기 때문에 데이터의 신뢰성을 잃게 된다.

해결 방안을 찾는 중.




반응형
반응형

출처:

http://blog.naver.com/PostView.nhn?blogId=timeofline&logNo=140098964103


BDE_Alias.ZIP




 

읽기, 추가, 삭제 포함.

 

예제를 만들어 소스화일과 같이 첨부한다.

다들 수고하고 감기 조심하자.

 

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBTables, ExtCtrls, Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    memo1: TMemo;

    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure value_loading(Aname : string);
    procedure value_writing;
    procedure ComboBox1Change(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormActivate(Sender: TObject);
begin
 RadioGroup1Click(Sender);
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
 var
  CurrentAliases: TStringList;
begin
 case RadioGroup1.ItemIndex of
 0,2 : begin
        ComboBox1.Style := csDropDownList;
        CurrentAliases := TStringList.Create;
        try
         Session.GetAliasNames(CurrentAliases) ;
         ComboBox1.Items:= CurrentAliases;
        finally
         CurrentAliases.Free;
        end;

        IF ComboBox1.Items.Count > 0 then
         begin
          ComboBox1.ItemIndex := 0;
          ComboBox1.OnChange(Sender);
         end;
       end;
   1 : begin
        ComboBox1.Clear;
        ComboBox1.Items.Add('ERPDB');
        ComboBox1.SetFocus;
        ComboBox1.ItemIndex := 0;
        ComboBox1.SelectAll;
        ComboBox1.Style := csDropDown;
       end;
 end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 Case RadioGroup1.ItemIndex of
 0, 2 : begin
        if ComboBox1.ItemIndex <> -1 then
        value_loading(ComboBox1.text);
        end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Case RadioGroup1.ItemIndex of
    0 : RadioGroup1.OnClick(Sender);
    1 : begin
         IF Trim(ComboBox1.Text) <> '' then
         value_writing
         else
          ShowMessage('Alias명 또는 Params List를 확인하세요');
        end;
    2 : begin
         IF ComboBox1.ItemIndex <> -1 then
         begin
          IF MessageDlg('Alias('+ComboBox1.Text+')를 정말 삭제하시겠습니까?' +#13#13+ '삭제된 Alias는 복구되지 않습니다.',mtWarning,mbOKCancel,0) = mrOK then
          begin
          Session.DeleteAlias(ComboBox1.Text);
          ShowMessage('Alias('+ComboBox1.Text+')가 삭제되었습니다.');
          RadioGroup1.OnClick(Sender);
          end;
         end else
          ShowMessage('삭제할 Alias가 선택되지 않았습니다.');
        end;
  end;
end;

procedure TForm1.value_loading(Aname : string);
var
  sMaybeAlias : string;
  ParamList : TStringList;
begin
 if ComboBox1.ItemIndex <> -1 then
 begin
  sMaybeAlias := ComboBox1.Text;
  if Session.isAlias(sMaybeAlias) then
  begin
    ParamList := TStringList.Create;
    try
     Session.GetAliasParams(sMaybeAlias, ParamList) ;
     //     ListBox1.Items := ParamList;
     memo1.Lines := ParamList;
    finally
     ParamList.Free;
    end;
  end
  else
  ShowMessage(sMaybeAlias) ;
 end;
end;

procedure TForm1.value_writing;
var NewAliasParams : TStringList;
    AliasName : string;
    i : Integer;
    s : string;
begin
  ComboBox1.text := Trim(ComboBox1.text);
  AliasName:=ComboBox1.text;

  IF Session.IsAlias(AliasName) then
  Case MessageDlg('이미 Alias : '+AliasName+' 가 존재합니다.'+#13#13+'삭제한 후 진행할까요?' +#13#13+ '삭제된 Alias는 복구되지 않습니다.',mtWarning,mbOKCancel,0) of
  mrOk     : Session.DeleteAlias(AliasName);
  mrCancel : Exit;
  end;

  NewAliasParams := TStringList.create;
  try
    for i := 0 to memo1.Lines.Count-1 do
    begin
     s := memo1.Lines.Strings[i];
     if (Trim(s) <> '') and (Trim(Copy(s,1,Pos('=',s)-1)) <> '') and (Trim(Copy(s, Pos('=',s)+1 , Length(s))) <> '') then
      NewAliasParams.Values[ Trim(Copy(s,1,Pos('=',s)-1)) ] := Trim(Copy(s, Pos('=',s)+1 , Length(s)));
    end;

    Session.AddAlias(AliasName, 'MSSQL', NewAliasParams) ;
    Session.SaveConfigFile;
    ShowMessage('Alias : '+ AliasName +' 이 정상적으로 등록되었습니다.');
    {
    NewAliasParams.Values['DATABASE NAME'] := 'DBname';
    NewAliasParams.Values['SERVER NAME'] := '192.168.0.1';
    NewAliasParams.Values['USER NAME'] := 'sa';
    NewAliasParams.Values['OPEN MODE'] := 'READ/WRITE';
    NewAliasParams.Values['SCHEMA CACHE SIZE'] := '8';
    NewAliasParams.Values['BLOB EDIT LOGGING'] := '';
    NewAliasParams.Values['LANGDRIVER'] := '';
    NewAliasParams.Values['SQLQRYMODE'] := '';
    NewAliasParams.Values['SQLPASSTHRU MODE'] := 'SHARED AUTOCOMMIT';
    NewAliasParams.Values['DATE MODE'] := '0';
    NewAliasParams.Values['SCHEMA CACHE TIME'] := '-1';
    NewAliasParams.Values['MAX QUERY TIME'] := '300';
    NewAliasParams.Values['MAX ROWS'] := '-1';
    NewAliasParams.Values['BATCH COUNT'] := '200';
    NewAliasParams.Values['ENABLE SCHEMA CACHE'] := 'FALSE';
    NewAliasParams.Values['SCHEMA CACHE DIR'] := '';
    NewAliasParams.Values['HOST NAME'] := '';
    NewAliasParams.Values['APPLICATION NAME'] := '';
    NewAliasParams.Values['NATIONAL LANG NAME'] := '';
    NewAliasParams.Values['ENABLE BCD'] := 'FALSE';
    NewAliasParams.Values['TDS PACKET SIZE'] := '4096';
    NewAliasParams.Values['BLOBS TO CACHE'] := '64';
    NewAliasParams.Values['BLOB SIZE'] := '32';
    Session.AddAlias(AliasName, 'MSSQL', NewAliasParams) ;
    Session.SaveConfigFile;
    }
  except
    on E: Exception do
    MessageDlg(E.Message, mtWarning, [mbOK], 0);
  end;
 NewAliasParams.Free;
end;

end.

 

 

반응형
반응형

열거형 타입 ( Delphi enum type )

type
  TDatabaseType
    = (dbtMSSQL, dbtOracle, dbtCUBRID, dbtSybase, dbtNone);

  TDatabaseSet = set of TDatabaseType;

const
  StrDatabaseNames : array[TDatabaseType] of String
    = ('MSSQL', 'Oracle', 'CUBRID', 'Sybase', 'None');

 함수  내용
 Typeinfo  열거형의 형정보(TypeInfo)에 대한 포인터 반환
 GetEnumName  열거형의 각 멤버를 문자열로 반환
 GetEnumValue  
 Ord  
 Pred  
 Succ  
 Dec  
 Inc  
 Low  


procedure TForm1.Button1Click(Sender: TObject);
var
  DatabaseType : TDatabaseType;
begin
  // GetEnumValue : String to Enum
  DatabaseType := TDatabaseType(GetEnumValue(TypeInfo(TDatabaseType), 'dbtOracle'));

  // GetEnumName : Enum to String
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Ord
  ShowMessage(IntToStr(Ord(dbtOracle))); // 1

  // Dec
  Dec(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtMSSQL

  // Inc
  Inc(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Low, High / Loop
  for DatabaseType := Low(TDatabaseType) to High(TDatabaseType) do
    ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType)));
end;

- end -

출처: http://bluexmas.tistory.com/187


반응형
반응형

알아두면 아주 편리한 함수입니다..
실제로 마스크에디터와 같은 역할을 하는 함수입니다..

예를 들어 DB에 '20000102'라는 문자열로 날짜가 저정되어
있는 경우 화면에 보여줄때.. 2000년01월02일 이라고 표현해야 합니다.

이때 label이나 string에 넣어야 한다면 어떻게 합니까..?
가장 원초적인 방법은 copy 함수로 짤라서 '년' 문자열을 붙이는
방법일 것입니다..

하지만 FormatMaskText('!0000년90년90일;0; ','20000102')
위와 같이 하면 간단히 해결되지요..

아시는 분도 있겠지만..
초보자를 위한 간단한 팁이었습니다..
자세한 내용은 델파이 핼프를 참조하세요..


uses -> MaskUtils 추가

반응형
반응형

Var
  StartTick,Freq,EndTick : int64;
begin
  QueryPerformanceCounter(StartTick); // Windows 에 선언된 kernel32.dll API
  QueryPerformanceFrequency(Freq);
  { 측정할 코드.. }
  QueryPerformanceCounter(EndTick);
  Showmessage(Formatfloat('0.000000',(EndTick-StartTick)/Freq)+'초 소요됨');
end;



이 방법을 사용하여 16밀리초 미만의 시간도 잡아낼 수 있습니다. CPU의 성능 카운터값을 호출해오는 것으로 알고 있습니다. MSDN에 따르면 윈도95 / NT3.1부터 포함되어 있다고 합니다. 화면갱신시 fps 계산시에도 이 값을 역수로 만들면 현순간 기준 fps를 계산 가능합니다. 저는 실제 코딩에서는 Freq값이 변하지 않기에 프로시저가 아닌 함수로 포장해서 사용하는데 여러분 손에 익은 대로 사용하시기 바랍니다.

단점이 없는 것은 아닙니다. 거의 모든 시스템에서 이 코드가 정상작동하지만, 극소수의 퍼포먼스카운터 API를 미지원하는 시스템에서는 QueryPerformanceCounter 값이 0으로 잡힌다고 합니다. 필요한 경우 0으로 나누는 등의 문제를 막기 위해 failsafe한 안전망을 설치해두시는 편이 좋겠습니다.

반응형
반응형

만들면서 나중에 잊어버릴까 해서 일기 형식으로 남겨놓음.


소켓 통신은 String형식으로 전달해서 구조체로 가져올 수도 있으며, 문자 자체로 가져올 수 있음.



ServerSocketClientConnect 프로퍼티

반응형
반응형

작업하다 혹시 나중에 또 필요할 것 같아서 올려놓는다.


채팅방 기본 소켓 이용.


동작확인 여부 : O


출처 : 델마당 자료실


21_Chat_fix2.zip


반응형
반응형

function My_IP : String;

var
  WSAData: TWSAData;
  HostName, IPAddress: String;
  HostEnt: PHostEnt;
begin
  WSAStartup(2, WSAData);

  SetLength(HostName, 255);

  GetHostname(PChar(HostName), 255);

  SetLength(HostName, StrLen(PChar(HostName)));

  HostEnt := GetHostByName(PChar(HostName));

  with HostEnt^ do

  IPAddress := Format('%d.%d.%d.%d',[Byte(h_addr^[0]), Byte(h_addr^[1]),

  Byte(h_addr^[2]), Byte(h_addr^[3])]);

  WSACleanup;

  Result := IPAddress;
end;


uese절에 Winsock 추가

반응형
반응형