Как загрузить файлы и сохранить их по локальному пути сервера, когда MS SQL SERVER разрешает удаленные подключения? - PullRequest
1 голос
/ 27 апреля 2010

Я занимаюсь разработкой приложения для win32 windows с Delphi и MS SQL Server. он работает нормально в локальной сети, но я пытаюсь добавить поддержку удаленных соединений SQL Server (= работа с БД, к которой можно получить доступ с помощью внешнего IP-адреса, как описано в этой статье: http://support.microsoft.com/default.aspx?scid=kb;EN-US;914277).

В основном у меня есть таблица в БД, в которой я храню DocumentID, описание документа и путь к документу (например, \\FILESERVER\MyApplicationDocuments\45.zip).

Конечно, \\FILESERVER - это локальный (LAN) путь для сервера, но не для клиента (как я сейчас пытаюсь добавить поддержку удаленных подключений).

Поэтому мне нужен способ доступа к \\FILESERVER, даже если, конечно, я не вижу его в локальной сети.

Я нашел следующий фрагмент кода T-SQL, который идеально подходит для «трюка загрузки»:

ВЫБРАТЬ BulkColumn как MyFile ИЗ OPENROWSET (BULK '\ FILESERVER \ MyApplicationDocuments \ 45.zip', SINGLE_BLOB), как X

С помощью приведенного выше кода я могу загрузить файл на клиенте.

а как его загрузить? Мне нужен «трюк с загрузкой», чтобы иметь возможность вставлять новые файлы, а также удалять или заменять существующие файлы.

Кто-нибудь может подсказать? Если трюк не доступен, не могли бы вы предложить альтернативу? Как расширенная хранимая процедура или вызов некоторой сборки .net с сервера.

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

Если у вас есть sql 2008, то вы можете использовать FILESTREAM , тогда сервер sql автоматически выбросит его на диск.

Если у вас есть sql 2005, я бы подумал просто переместить данные в столбец varbinary (max) и разобраться с этим (тоже довольно просто).

Если ни один из них не применяется ИЛИ вы не можете поместить его в столбец varbinary, то я бы не стал использовать сервер sql для обработки фактического содержимого файла, а вместо этого просто имел бы веб-службу, которая сохраняла файл в файловой системе или SAN, что веб-сервис может легко получить доступ. (тоже самое что ИМХО)

UPDATE : Еще одна идея, которая пришла мне в голову. Если вы используете SQL 2005/08, вы можете написать CLR хранимую процедуру в .Net . Это может обеспечить передачу данных BLOB-объектов в / из локальной файловой системы.

0 голосов
/ 30 апреля 2010

Если вы работаете в 2005 году, вы можете попытаться сохранить файл в поле временного блоба некоторой временной таблицы, а затем вызвать хранимую процедуру, которая должна поместить файл в нужное вам место, и обновить поле пути, как вы хотите.

В этой хранимой процедуре вы должны использовать расширенные хранимые процедуры (xp_something), которые разрешают доступ к файловой системе. Это означает, что они должны быть включены для сервера SQL.

Кстати, вы пытаетесь использовать реляционную БД в качестве базы данных документов. Это рано или поздно приведет к обратному эффекту.

0 голосов
/ 27 апреля 2010

В идеальном мире я бы создал простое: - ASP.NET Web Service - или .Net Remoting Service (быстрее, чем веб-сервис) - или новый сервис .Net 4.0 RIA.

Разверните его на SQL Server через пользовательский порт TCP / IP

Эта служба будет прослушивать порт, а клиент будет запрашивать файл через службу. Служба получает файл через локальную локальную сеть и связывается с БД через локальное соединение OLE DB.

Я бы не использовал поддержку веб-службы SQl Server - это проблемы безопасности и производительности.

UPDATE: Поскольку это приложение Delphi - вы можете сделать то же самое с помощью Delphi, даже если вышеуказанное решение остается в силе, но требуется больше усилий для интеграции различных технологий. Delphi имеет собственные инструменты для создания удаленных приложений

...