일단 단순 로긴 인증을 거치게 하는 루틴을 오라클DB를 사용하고, 마이다스로 구성하였으며, 문제가 되는 코드는 다음과 같습니다.
function Tgasang.vlogin(UID, UPasswd: OleVariant): OleVariant;
var
v : Variant;
begin
v := varArrayCreate([1,2], varVariant);
with query1 do begin
Close;
SQL.Clear;
SQL.Add(' Select * from 오라클에있는테이블 ');
SQL.Add(' Where 아이디필드 = :p1 ');
params[0].AsString := UID; // or ParambyName('p1').AsString := UID
open;
if EOF then begin
v[1] := false;
v[2] := FieldByName('패스워드필드').asString; //'사용자가 없음';
end
else if FieldByName('패스워드필드').asString <> UPasswd then begin
v[1] := false;
v[2] := '암호가 아님';
end
else begin
v[1] := True;
v[2] := '로긴성공';
end;
end;
result := v;
end;
이렇게 하면 Fieldbyname으로 넘오는값이 리턴되지 않습니다. DB를 MS-SQL로 사용하면 잘 되거든요. 그리고, SQL.Add(' select * from 테이블 where 아디필드 = 1')
이런씩으로 넣으면 결과값이 리턴됩니다.
무엇이 문제인지 아시면 가르쳐 주세요.
아니 일거라 확신(?)합니다.
아마 오라클과 에스큐엘의 CHAR형식에 대한 오해에서 비롯된 문제인것같습니다.
에스큐엘에 NAME CHAR(8) 에 "ABC "를 입력하면 저장값은 "ABC"가 됩니다.
반면 오라클은 "ABC "이렇게 8자리를 꽉채워 들어가게 되죠
물론 VARCHAR타입을 쓰면 오라클 역시 "ABC"라고 들어가기 때문에
별 문제가 없습니다.
이쯤 되면 이해가 되셨으리 생각됩니다.
델파이의 PARAMBYNAME이 공백이 제거된 값을 인수로 넘겨주기 때문에
디비에 실제 저장된값(실제값+저장공간크기만큼의 공백)과 공백을 제거한값이
틀리기때문에 비교가 안되는 거라 생각이 됩니다.
델파이의 PARAMBYNAME이 여러모로 자주 속을섞이 더라구요
그래서 저는 왠만하면 바로 문자열로 연결해서 사용을 하고 있습니다.
그럼...
강정한 wrote:
> 일단 단순 로긴 인증을 거치게 하는 루틴을 오라클DB를 사용하고, 마이다스로 구성하였으며, 문제가 되는 코드는 다음과 같습니다.
> function Tgasang.vlogin(UID, UPasswd: OleVariant): OleVariant;
> var
> v : Variant;
> begin
> v := varArrayCreate([1,2], varVariant);
> with query1 do begin
> Close;
> SQL.Clear;
> SQL.Add(' Select * from 오라클에있는테이블 ');
> SQL.Add(' Where 아이디필드 = :p1 ');
> params[0].AsString := UID; // or ParambyName('p1').AsString := UID
> open;
> if EOF then begin
> v[1] := false;
> v[2] := FieldByName('패스워드필드').asString; //'사용자가 없음';
> end
> else if FieldByName('패스워드필드').asString <> UPasswd then begin
> v[1] := false;
> v[2] := '암호가 아님';
> end
> else begin
> v[1] := True;
> v[2] := '로긴성공';
> end;
> end;
> result := v;
> end;
>
> 이렇게 하면 Fieldbyname으로 넘오는값이 리턴되지 않습니다. DB를 MS-SQL로 사용하면 잘 되거든요. 그리고, SQL.Add(' select * from 테이블 where 아디필드 = 1')
> 이런씩으로 넣으면 결과값이 리턴됩니다.
> 무엇이 문제인지 아시면 가르쳐 주세요.