Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Копировать файлы по URL  [new]
vah
Member

Откуда:
Сообщений: 2694
Возможно ли научить MSSQL копировать файлы по URL?

Заранее благодарен.
14 авг 12, 17:31    [13010678]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
vah,

Это?
1093353
14 авг 12, 17:34    [13010703]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
vah
Member

Откуда:
Сообщений: 2694
trew
vah,

Это?
1093353


не, немного не то...
надо картинки копировать в каталог
14 авг 12, 17:42    [13010739]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
vah,
Куда-та в эту строну
12688264
14 авг 12, 18:04    [13010870]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
vah,

Самый простой метод: CLR + WebClient
15 авг 12, 12:18    [13013933]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Jovanny
Самый простой метод: CLR + WebClient
И чем он проще OLE?
Не проще и больше гемора, но типа кошернее для последних версий скуля.
15 авг 12, 12:38    [13014093]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mnior,

Не пробовал OLE, но в CLR достаточно процедуры из двух строчек.

WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");


Ну и, конечно, сборки загрузить соответствующие. Кроме того, в классе WebClient есть методы, позволяющие загрузить файл в виде массива байтов или строки, которые можно сразу сохранить в таблице.
15 авг 12, 12:49    [13014175]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Jovanny
Не пробовал OLE
Ну и как тогда вы можете писать "Самый простой метод".
Пройдитесь по ссылкам выше, расширьте свой кругозор.
Jovanny
WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "=".
Дошло?

Параллельная тема: 13016482
15 авг 12, 17:30    [13016569]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mnior
Jovanny
WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "=".
Дошло?

Нет, не дошло.:)

CLR функция в самом простом виде будет выглядеть примерно так:
using System.Data.SqlTypes;
using System.Net;

public partial class UserDefinedFunctions {
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBinary FileDownload(SqlString Url) {
        WebClient webClient = new WebClient();
        byte[] output = webClient.DownloadData(Url.ToString());
        return new SqlBinary(output);
    }
};


Её представление в базе:
CREATE FUNCTION [dbo].[FileDownload](@Url [nvarchar](4000))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [MyAssembly].[UserDefinedFunctions].[FileDownload]


Вызов:
DECLARE @myImage varbinary(max)

SET @myImage = [dbo].[FileDownload] ('http://www.mysite.com/images/464686.jpg')

SELECT @myImage


Это работающий пример.
16 авг 12, 12:14    [13019541]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Jovanny
Нет, не дошло.
Опять вставляю оные скрипты - ошибки. Типа:
Msg 6528, Level 16, State 1, Procedure FileDownload, Line 1
Сборка "MyAssembly" не найдена в каталоге SQL базы данных
Ну и сколько вы будете сне объяснять как это добро запустить? Неделю?

Вот этот 8197124 тупо запустил и сразу работает.
16 авг 12, 19:55    [13022936]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mnior,

Признаться немного удивлён, что специалист Вашего уровня плохо разбирается в CLR.

В MS Visual Studio (у меня 2010 Premium, думаю, в Express может быть недоступно) делаем следующие шаги:
1. Создаём новый проект File->New->Project->Database->SQLServer->Visual C# SQL CLR Database Project.
2. В свойствах проекта на вкладке Database прописываем строку подключения к нашей базе.
3. В Solution Explorer кликаем правой кнопкой на проекте и выбираем Add->User-DefinedFunction. Вводим имя модуля - не важно какое, в него можно напихать сколько угодно функций.
4. Вместо сгенерированного текста вставляем:
using System.Data.SqlTypes;
using System.Net;

public partial class UserDefinedFunctions {
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBinary FileDownload(SqlString Url) {
        WebClient webClient = new WebClient();
        byte[] output = webClient.DownloadData(Url.ToString());
        return new SqlBinary(output);
    }
};

4. Компилируем проект. Все необходимые сборки проект берёт из базы данных. Если их там нет, о чём Вам сообщат окна Error List и Output, их нужно туда импортировать через команду T-SQL CREATE ASSSEMBLY.
5. После удачной компиляции кликаем правой кнопкой на проекте и выбираем "Deploy".
6. Visual Studio должен импортировать Вашу сборку (совпадающую с названием проекта) и создать
CREATE FUNCTION [dbo].[FileDownload](@Url [nvarchar](4000))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [MyAssembly].[UserDefinedFunctions].[FileDownload]

Поменяйте RETURNS [varbinary](8000) на RETURNS [varbinary](max) через ALTER FUNCTION, чтобы не было ошибок при загрузке файлов больше 8000 байт.
Импортировать сборку и создавать функцию можно и вручную через CREATE ASSSEMBLY и CREATE FUNCTION.

Всё.
17 авг 12, 15:39    [13027494]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Jovanny
1. Качаем VS ...
100500. Вух. Всё. <стирая пот с лица>
Салфеточку?
Как наглядно вы продемонстрировали что CLR "самое простое что может быть во вселенной" и тем более "проще" чем тупо запустить скриптик (нажать Alt+X один раз).

Jovanny
Признаться немного удивлён, что специалист Вашего уровня плохо разбирается в CLR.
Даблспоук.
Хотя да, я далеко не крутой перец в CLR.

+ Но стебаться можно дальше
Jovanny
В MS Visual Studio (у меня 2010 Premium, думаю, в Express может быть недоступно)
Типа у всех он обязан быть.
Про Express даже не смутило. :)
Но позабавило другое - "у меня". Типа когда советуют другим (что CLR проще), почемуто обдумывают только себя родимого.
Я понимаю что все "тру" проггеры аутисты, но не на столько же.
Jovanny
делаем следующие шагИ:
Прям синоним простоты.
Jovanny
2. В свойствах проекта на вкладке Database прописываем строку подключения к нашей базе.
Ну да ну да, типа все базы доступны, мы все тут админы, ещё скажи к продакшену.
Jovanny
Если их там нет, о чём Вам сообщат окна Error List и Output, их нужно туда импортировать через команду T-SQL CREATE ASSSEMBLY.
Это не одно Если, код которого надо ещё написать, что вы опустили.
Jovanny
5. ... "Deploy".
Это тоже к п. 2
Jovanny
... Поменяйте ... чтобы ... если ...
Да да, домохозяйка это всё поймёт и не ошибётся нигде.
Но всё-таки до нормального простого скрипта вы не дотянули даже близко. Думаю реально было выложить скрипт для MSBuild который бы всё (почти) это добро сделал сам и без мышкодрочества. Который можно было тупо запустить. И даже ипатня с DLL файлами не нужна была - а сгенерил бы готовый скрипт для выставления (для админа).
Вот тогда можно было о чём-то говорить.

PS. Для тех кто в танке. Вопрос не в том что "реально сделать", а что "проще всего". CLR не так сложен, но потратить время и ресурсы придётся. Когда уже что-то есть наработанное, сюда не ходят с вопросами как у TC.
18 авг 12, 00:09    [13029600]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Jovanny
Mnior,

Не пробовал OLE, но в CLR достаточно процедуры из двух строчек.
Эти 2 строчки недостаточно, нужно делать соответствующий проект с файлами, деплоить и всё такое.

Это было бы проще, если бы можно было на T-SQL написать что то вроде:
CREATE CLR FUNCTION ffff
as CLR_TEXT('
WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");
')
18 авг 12, 12:54    [13030491]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mnior
Вопрос не в том что "реально сделать", а что "проще всего". CLR не так сложен, но потратить время и ресурсы придётся.


Уверен, что время, потраченное на изучение CLR, окупится на все 100%.
А как долго будут поддерживаться OLE И COM - вопрос интересный.
20 авг 12, 11:42    [13035795]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
Jovanny
Mnior
пропущено...
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "=".
Дошло?

Нет, не дошло.:)

CLR функция в самом простом виде будет выглядеть примерно так:
using System.Data.SqlTypes;
using System.Net;

public partial class UserDefinedFunctions {
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBinary FileDownload(SqlString Url) {
        WebClient webClient = new WebClient();
        byte[] output = webClient.DownloadData(Url.ToString());
        return new SqlBinary(output);
    }
};


Её представление в базе:
CREATE FUNCTION [dbo].[FileDownload](@Url [nvarchar](4000))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [MyAssembly].[UserDefinedFunctions].[FileDownload]


Вызов:
DECLARE @myImage varbinary(max)

SET @myImage = [dbo].[FileDownload] ('http://www.mysite.com/images/464686.jpg')

SELECT @myImage


Это работающий пример.

Прошу прощения, что влазю в ваш высокоителлектуальный спор... Мне бы вот такого кода вполне хватило и как раз для загрузки файлов с веб-сервера в БД MS SQL Server. Почитал в справке по CLR, создал файлик test.cs, скопировал туда код, прописал в Path путь к .NET FW 3.5, скомпилировал csc /target:library test.cs, получился файлик test.dll и вот при попытке зарегистрировать все это:
CREATE ASSEMBLY MyAssembly from 'C:\test.dll' WITH PERMISSION_SET = SAFE

выдает мне зараза ошибку:
Сообщение 6511, уровень 16, состояние 82, строка 1
Не удалось инициализировать среду CLR v2.0.50727 при помощи HRESULT 0x8007000e. Попробуйте устранить проблему и повторите попытку позже.

Стал читать про инициализацию CLR и понял что потрачу на это слишком много времени и возможно нихрена не пойму. В чем может быть проблема, подскажите? В настройках контактной зоны, интеграция со средой CLR включена.
29 авг 12, 03:50    [13079470]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
судя по статье Возможные причины «Не удалось инициализировать общеязыковая среда выполнения (CLR)» при использовании SQL CLR
пишут, что нехватка памяти
29 авг 12, 08:25    [13079605]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
HandKot,
Сервер Xeon 2.4, 4 ГБ ОЗУ. Крутится только MS SQL Server 2005. Правда БД уже за 75 Гб. Пользователей одновременно до 100 чел... Может правда маловато?
29 авг 12, 10:10    [13080068]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Miktor
прописал в Path путь к .NET FW 3.5
Не удалось инициализировать среду CLR v2.0.50727 при помощи HRESULT 0x8007000e.


Попробуйте скомпилировать проект для .Net 2.0.
29 авг 12, 11:04    [13080502]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Эпично.

Абстракции текут. Другой вопрос - как.

Да, для Server 2005 нужён 2.0, и вообще всё тяжело довольно таки с этими версиями.
При любом пуке надо менять, рекомпилить ...
29 авг 12, 12:11    [13081229]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mnior
Эпично.

Абстракции текут. Другой вопрос - как.


В Visual Studio в свойствах проекта указывается версия .Net Framework.
Для любителей командной строки:
Компиляция в командной строке
29 авг 12, 12:32    [13081408]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
Jovanny
Miktor
прописал в Path путь к .NET FW 3.5
Не удалось инициализировать среду CLR v2.0.50727 при помощи HRESULT 0x8007000e.


Попробуйте скомпилировать проект для .Net 2.0.

Я потом подумал про это, сменил путь в переменной Path на 2.0 и перекомпилил. Не помогло.
Jovanny
Mnior
Эпично.

Абстракции текут. Другой вопрос - как.


В Visual Studio в свойствах проекта указывается версия .Net Framework.
Для любителей командной строки:
Компиляция в командной строке

Visual Studio не стоит. Соответственно свойств проекта нема. Есть только файлик с несколькими строчками с расширением cs. Неушто для такой маленькой задачи нужно ставить VS? По ссылке - там опять же компилятор для проекта. Ну и ессно ругается при попытке компилировать мой файлик, просто поменяв расширение на csproj.
30 авг 12, 01:27    [13086188]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
Магическим образом после перезапуска службы MSSQLSERVER, все зарегистрировалось 8)
30 авг 12, 07:13    [13086334]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
Но приключения на этом не закончились...
При попытке выполнить команду
SET @myImage = [dbo].[FileDownload] ('http://www.mysite.com/upload/attachment/27072012344.jpg')

Получил в ответ вот это:
Сообщение 6522, уровень 16, состояние 1, строка 3
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или статистической функции "FileDownload": 
System.Security.SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException: 
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadData(Uri address)
   at System.Net.WebClient.DownloadData(String address)
   at UserDefinedFunctions.FileDownload(SqlString Url)

URL вполне нормальный. Т.е. если его воткнуть в браузер - покажет ту самую картинку. Че ему надо то?
30 авг 12, 07:54    [13086379]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
правильно регситрировать сборку
надо было выбирать EXTERNAL_ACCESS, а не SAFE, который не дает прав на внешние ресурсы
30 авг 12, 07:58    [13086385]     Ответить | Цитировать Сообщить модератору
 Re: Копировать файлы по URL  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 398
Сильно не пинайте,... понимаю что достал
Переделал на EXTERNAL_ACCESS
Теперь не регистрирует:
Сообщение 6533, уровень 16, состояние 48, строка 1
AppDomain Delo.dbo[ddl].11 выгружено политикой расширения для обеспечения согласованности приложения. При попытке доступа к критическому ресурсу обнаружена нехватка памяти. 
30 авг 12, 08:32    [13086433]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить