메인 폼에서 라벨과 버튼을 이용해 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.