2010-04-27 3 views
1

델파이와 MS SQL 서버로 win32 windows 어플리케이션을 개발 중입니다. LAN에서 정상적으로 작동하지만 SQL Server 원격 연결 (이 기사에서 설명한대로 외부 IP로 액세스 할 수있는 DB 작업)을 추가하려고합니다. http://support.microsoft.com/default.aspx?scid=kb;EN-US;914277).MS SQL SERVER가 원격 연결을 허용 할 때 파일을 업로드하고 서버 로컬 경로에 저장하는 방법은 무엇입니까?

기본적으로 DocumentID, 문서 설명 및 문서 경로 (예 : \\FILESERVER\MyApplicationDocuments\45.zip)를 보관하는 DB가있는 테이블이 있습니다.

물론 \\FILESERVER은 서버의 로컬 (LAN) 경로이지만 클라이언트는 아닙니다 (이제는 원격 연결에 대한 지원을 추가하려고합니다).

그래서 내가 LAN에서 볼 수없는 경우에도 \\FILESERVER에 액세스하는 방법이 필요합니다.

SELECT OPENROWSET FROM을 MyFile로 BulkColumn (BULK '\ FILESERVER \ MyApplicationDocuments \ 45.zip', SINGLE_BLOB) AS X :

는 내가 "다운로드 트릭"에 대한 완벽 다음 T-SQL 코드 조각을 발견

위 코드를 사용하면 클라이언트에서 파일을 다운로드 할 수 있습니다.

하지만 업로드하는 방법은 무엇입니까? 새 파일을 삽입 할 수 있도록 기존 파일을 삭제하거나 대체 할 수 있도록 "Uppload 트릭"이 필요합니다.

누구든지 제안 할 수 있습니까? 트릭을 사용할 수 없다면 대안을 제안 할 수 있습니까? 확장 저장 프로 시저 또는 서버에서 .net 어셈블리를 호출하는 것과 같습니다.

+0

더 많은 태그를 추가하는 것이 좋습니다. – IMHO

+0

@IMHO : 실제로는 델파이 앱입니다. – NotMe

+0

내 대답은 업데이트했지만 접근 방식은 동일하게 유지됩니다. – IMHO

답변

1

SQL 2008을 사용하고 있다면 FILESTREAM을 사용할 수 있습니다. 그러면 SQL Server가 자동으로이를 디스크에 버립니다.

SQL 2005를 사용하는 경우 데이터를 varbinary(max) 열로 이동 한 다음 그 방법으로 처리하는 것도 고려해 볼 수 있습니다.

그 중 하나도 적용 할 수 없거나 varbinary 열에 밀어 넣을 수없는 경우 SQL Server를 사용하여 실제 파일 내용을 처리하지 않고 대신 파일 시스템에 파일을 저장 한 웹 서비스가 있거나 웹 서비스가 쉽게 액세스 할 수있는 SAN(IMHO와 동일)

업데이트 : 다른 생각은 내 마음을 교차 시켰습니다. SQL 2005/08을 사용하는 경우 CLR Stored procedure in .Net을 쓸 수 있습니다. 이것은 blob 데이터를 로컬 파일 시스템으로 /로부터 전송할 수 있습니다.

+0

SQL 2005/08을 지원하므로 CLR 저장 프로 시저가 실행 가능합니다 (filestream은 varbinary (max) column etiher가 아닙니다. 일반적으로 고객이 Express Edition을 사용하고 50GB 이상의 문서를 가지고 있기 때문에 적합하지 않습니다. 4GB DB 크기). 어쨌든 (IMHO가 제대로하지 않으므로) 트릭이나 CLR sp의 경우 SQL Server 메모리에 대한 부하가 있습니까? 따라서 10 개의 100MB 파일을 병렬로 전송해야하는 경우 모든 서버 (1GB) 메모리가 사용됩니다. CLR 이점은 "트릭"에 비해 보안을 향상시키는 데 있습니다. 내가 맞습니까? – LaBracca

+0

또한 보안 문제를 고려한 후에 CLR 저장 프로 시저로 이동하기로 결정 했으므로 코드가 덜 영향을 받았으며 공유 폴더에서 파일을 읽고 쓰는 루틴을 변경하고 CLR 저장 프로 시저 호출로 바꿀 필요가 있습니다. – LaBracca

0

이상적인 세계에서 나는 간단하게 만들 것입니다 : - ASP.NET 웹 서비스 - 또는 닷넷 리모팅 서비스 (웹 서비스보다 빠르게) - 또는 새로운 닷넷 4.0 RIA 서비스를 제공합니다.

이 서비스 포트를들을 것이며, 클라이언트가 서비스를 통해 파일을 요청합니다 사용자 정의 TCP/IP 포트

에서 SQL 서버로 배포합니다. 이 서비스는 로컬 LAN을 통해 파일을 가져 와서 로컬 OLE DB 연결을 통해 DB와 통신합니다.

SQl Server "웹 서비스"지원을 사용하지 않습니다. 이는 보안 및 성능 문제입니다.

업데이트 : 위의 해결 방법은 여전히 ​​유효하지만 다른 기술을 통합하기 위해 더 많은 작업을 수행하더라도 델파이 앱을 사용하면 동일한 작업을 수행 할 수 있습니다. 델파이는 원격 응용 프로그램을 구축하기위한 자체 도구가 있습니다

+0

보안 및 성능 문제에 대해 동의합니다. 그러나 내가해야 할 일은 복잡한 배치를 피하는 것입니다. 더 나아가 웹 서버에 문서 관리를 위임하더라도 어쨌든 SQL 서버를 사용하여 "원격 데이터"를 사용할 필요가있는 모든 고객에게 웹 서버를 설치해야합니다. 나는 애플 리케이션을 바꿀 수 없다. 처음부터 재 작성하는 것이 더 의미가있다. (다시 말하면 처음부터 재 작성한다는 것은 델파이가 아닌 ASP.NET과 같은 다른 기술을 선택한다는 의미이기 때문에). – LaBracca

+0

상식적으로는 보호 된 리소스 (LAN)에 액세스하려고하기 때문에 특별한 것을해야한다고 제안합니다. Delphi에서 웹 서버가 없어도 전체 내용을 작성할 수 있습니다. 이는 Windows 서비스 및 Delphi에서 매우 쉽게 할 수있는 TCP/IP 리스너를 통해 수행 할 수 있습니다. 여전히 위의 해결책을 찾으려면 Chris - FILESTREAM 게시하거나 BLOB에 데이터를 저장하십시오. – IMHO

0

2005 년이면 임시 테이블의 임시 BLOB 필드에 파일을 저장 한 다음 원하는 위치에 파일을 저장하고 원하는대로 경로 필드를 업데이트해야하는 저장 프로 시저를 호출 할 수 있습니다.

해당 저장 프로 시저에서 파일 시스템에 대한 액세스를 허용하는 확장 저장 프로 시저 (xp_something)를 사용해야합니다. 즉, SQL Server에 사용할 수 있어야합니다.

현재 문서 데이터베이스로 관계형 DB를 사용하려고합니다. 조만간 역효과를 낼 것입니다.

+0

xp_cmdshell을 사용하여 데이터를 임시 BLOB 필드에서 네트워크 경로로 이동할 수 있습니다. 이것은 내가 말할 수있는 나의 요구 사항을 충분합니다. db의 문서를 영원히 보존하지 않으며 확장 저장 프로 시저를 사용하여 temp BLOB를 공유 네트워크 폴더에 복사합니다. 문서 트래픽이 현저하게 증가하면 관계형 DB 트래픽이 발생하여 "역효과"위험이 있다는 데 동의합니다. 하지만 일단 화재가 느껴지면 다른 솔루션을 설계 할 수 있습니다. sqlserver 프로세스 소유자는 하나의 네트워크 폴더를 읽고 쓸 수있는 사용자로 설정할 수 있습니다. 코멘트? – LaBracca

관련 문제