현재 SQL Server에 대한 ODBC 별칭을 사용하여 데이터베이스에 연결하려고합니다. 내가 가지고있는 문제는 TQuery 객체를 사용하여 정보를 얻는 경우 항상 로그인 세부 정보를 요청한다는 것입니다 (ODBC 생성에서이 객체를 지정했는지 여부는 신경 쓰지 않습니다). 코드에서 수동으로 설정하는 데 신경 쓰지 않지만 어떻게 할 수는 없습니다.
내가 발견 한 가장 일반적인 해결책은 데이터베이스 구성 요소를 사용하여이를 수행하는 것입니다. 그러나 그 자체가 문제가 있습니다. 내 데이터 집합이 너무 커서 데이터베이스 구성 요소가 Paradox 테이블로 데이터 집합을 변환하기 때문에 '임시 테이블 리소스 제한'이라는 BDE 오류가 계속 발생합니다. 그래도 데이터베이스 구성 요소를 무시하면이 오류가 발생하지 않지만 로그인 프롬프트와 관련된 문제가 발생합니다. 누군가가 ADO와 같은 다른 연결 경로로 스와핑하지 않고 TQuerys에서이를 우회 할 수있는 방법을 찾았습니까?TDatabase bypass를 사용하지 않고 로그인 프롬프트 사용 안 함
답변
저는 BDE에 약간 녹슬었지만 프로젝트에서 TDatabase 구성 요소를 사용하고 있지 않다면 로그인 프롬프트를 피할 수있는 쉬운 방법이 없다고 생각합니다.
그 이유는 당신이 당신의 프로젝트에이 TDatabase (또는 TSession) 구성 요소없이 TQuery를 열려고하면 앱의 기본 세션 개체가 TQuery의 OpenCursor 내에서 아래의 루틴을 호출하는 것입니다 :
{ from DBTables.Pas }
function TSession.DoOpenDatabase(const DatabaseName: string; AOwner: TComponent): TDatabase;
var
TempDatabase: TDatabase;
begin
Result := nil;
LockSession;
try
TempDatabase := nil;
try
Result := DoFindDatabase(DatabaseName, AOwner);
if Result = nil then
begin
TempDatabase := TDatabase.Create(Self);
TempDatabase.DatabaseName := DatabaseName;
TempDatabase.KeepConnection := FKeepConnections;
TempDatabase.Temporary := True;
Result := TempDatabase;
end;
Result.Open;
Inc(Result.FRefCount);
except
TempDatabase.Free;
raise;
end;
finally
UnLockSession;
end;
end;
볼 수 있듯이, 세션이 올바른 이름을 가진 기존 TDatabase 구성 요소를 찾을 수 없다면, 임시 이름을 생성하고 Result.Open을 호출하여 로그인 프롬프트를 표시합니다. 볼 수 있으며 팝업 전에 암호 + 사용자 이름을 제공 할 수있는 기회를 제공합니다 (세션의 OnPassword가이 과정에서 호출되지 않는 것 같습니다).
분명히 앱에서 일어나는 일인 디버거를 사용하여 임시 TDatabase가 만들어 지는지 확인해야합니다.
아래의 업데이트에서 제안한 내용이 작동하지 않아서 TDatabase 구성 요소를 사용하지 않으려 고했다면 TQuery 자손을 파생시키고 OpenCursor를 재정의하려고합니다. 사용자 이름/암호가 걸릴 수 있는지 확인합니다.
어쨌든 명시 적 TDatabase를 사용하지 않는다는 것을 알기 때문에, "Temporary Table ..."문제로 인해 올바르게 이해한다면, 세션이 임시 어카운트를 만들 때 보니, 나는 임시 테이블이 "임시 테이블"오류를 일으키지 않는 이유를 조사하면서 앱에서 TDatabase 구성 요소를 사용하는 것이 분명히하는 반면에 가치가 있다고 가정 해보십시오. Idapi32.Cfg 구성 문제일까요? 현재 TQuery를 사용하여 SqlServer 테이블에서 SELECT를 수행하여 250,000 개 이상의 행을 반환 했음에도 불구하고 "임시 테이블"오류를 재현 할 수 없기 때문에이 문제를 해결할 수 없습니다.
아, 그 점 : 테이블에 BLOB가 포함되어 있습니까? BDE가 BLOB에 사용하는 임시 저장 공간을 줄이기 위해 Idapi 구성 매개 변수가 있다는 것을 상기 해 보입니다. (실제로는 0으로, 아마도 BDE를 사용한 이후로 오랜 시간이 걸렸습니다).
업데이트 : 업데이트 : 귀하의 쿼리가 세션에서 동적으로 TDatabase 개체를 만드는 것처럼 보이기 때문에 나 자신이 동적으로 만드는 TDatabase와 함께 작동 할 수도 있다는 생각이 들었습니다. 방금 다음을 시도해 보니 나를 위해 작동합니다.
procedure TForm1.DatabaseLogin(Database: TDatabase;
LoginParams: TStrings);
begin
LoginParams.Add('user name=sa');
LoginParams.Add('password=1234');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ADatabase : TDatabase;
begin
ADatabase := TDatabase.Create(Self);
ADatabase.AliasName := 'MAT41032';
ADatabase.DatabaseName := 'MAT41032';
ADatabase.SessionName := 'Default';
ADatabase.OnLogin := DatabaseLogin;
Query1.Open;
end;
+1 재미있는 질문은 btw입니다.
내가 찾던 정확한 답변이 아니었지만 정보가 크게 도움이되었습니다! 정말 고맙습니다. '임시 리소스 제한에 도달했습니다.'와 관련하여받은 오류가 궁금한 경우 여러 데이터 소스와 여러 쿼리 구성 요소를 사용하고있는 것으로 보입니다. – gn12345
어쨌든, 다행 이네. 리소스 제한과 관련이있을 수있는 BDE에 대한 ISTR 몇 가지 : 메모리 매핑 파일을 사용하지만 캐싱, IPC 여부는 알지 못합니다. 또한 IDAPI32.Cfg 설정을 제어/제한하는 것이 좋습니다. BLOB 데이터의 캐싱 - 리소스 제한을 설정하고 0으로 설정 한 다음 필요할 때 BLOB를 가져 오는 것이 었습니다. 나는 그 설정의 이름을 기억할 수는 없지만, 인터넷 검색을해야만한다. 그것은 볼랜드 뉴스 그룹에서 몇 차례 나왔다. – MartynA
ADO를 사용하지 않는 이유는 무엇입니까?SQL Server에서 데이터를 가져 오는 데 TAdoQuery를 설정하는 데 최대 2 분이 걸릴 것이므로 BDE가 영구적으로 없어집니다. 어쨌든 BDE로 위기에 빠져있는 것처럼 들리네. – MartynA
나는 내가 BDE 자신의 팬이 아니라는 것을 인정한다. 우리는 BDE로부터 전환하는 단계에있다. 그러나이 프로젝트를 진행하는 동안이 문제와 관련하여 동일한 연결 방법을 고수하도록 지시를 받았습니다. 나는 ADO를 사용하도록 제안했지만, 그렇게하면 응용 프로그램에 더 많은 문제가 발생할 수 있다는 걱정이 있습니다. – gn12345
불운. 최선의 방법은 TDatabase 구성 요소를 사용할 수 있도록 "임시 테이블 리소스 제한"오류를 피하는 것일 수도 있습니다. – MartynA