Q&A

  • DLL에서 ADOConnection과 ADOQuery를 쓰려고 하는데...
메인 폼에서 라벨과 버튼을 이용해 DB에 저장된 항목이 있는지 확인하는 작업을 하려고 합니다.

메인 폼에는 그저 라벨과 버튼 하나씩만 있고, 항목을 입력한 뒤 버튼을 누르면, DLL파일의 함수를 실행시켜 DLL 내부적으로 ADOConnection과 ADOQuery를 걸어서 해당 항목이 있으면 1을 리턴하고, 없으면 0을 리턴하도록 했습니다.

그런데, 계속 DLL에서 Access Violation 오류가 나네요.

소스를 찍어드릴테니 어떻게 해야할지 좀 알려주세요...







// DLL project

//-----------------------------------------------------



library URLCheckDll;



uses

SysUtils,

Classes,

Unit1 in 'Unit1.pas' {Form1};





exports

Connect_DB,

Check_URL;





begin

end.









// DLL 폼

//---------------------------------------------------------



unit Unit1;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DB, ADODB;



type

TForm1 = class(TForm)

ADOConnection1: TADOConnection;

ADOQuery1: TADOQuery;

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;

procedure Connect_DB(ConStr : string);

function Check_URL(URL: string): integer;



implementation



{$R *.dfm}



procedure Connect_DB(ConStr : string);

begin

with Form1 do

begin

ADOConnection1.ConnectionString := Constr;

ADOConnection1.Connected := True;

end;





end;





function Check_URL(URL : string): integer;

begin



with Form1 do

begin

ADOQuery1.Close;

ADOQuery1.SQL.Clear;

ADOQUery1.SQL.Add('select count(*) from sitelist where url = :URL');

ADOQuery1.Parameters.ParamByName('URL').Value := Trim(URL);

ADOQuery1.Open;



if ( ADOQuery1.Fields[0].AsInteger <> 0 ) then

Result := 1

else

Result := 0;



end;



end;







end.









// EXE 메인 폼

//-------------------------------------------------------------------



unit mainf;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;



type

Tmainform1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

mainform1: Tmainform1;

procedure Connect_DB(ConStr : string) ; external 'URLCheckDll.dll';

function Check_URL(URL : string) : integer; external 'URLCheckDll.dll';



implementation



{$R *.dfm}



procedure Tmainform1.Button1Click(Sender: TObject);

var

ret_value : integer;

URL : string;

begin



// DB Connection String은 정확하게 줍니다...

Connect_DB('Provider=SQLOLEDB.1;Password=...');



URL := Trim(Edit1.Text);



ret_value := Check_URL(URL);

if ( ret_value = 1 ) then

ShowMessage('URL : '+URL+' 은 DB에 포함되어 있습니다.')

else

ShowMessage('URL : '+URL+' 은 DB에 없습니다.');





end;



end.

0  COMMENTS