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

Откуда:
Сообщений: 11621
это настраивается под правами админа в настройках IE
10 сен 15, 17:38    [18134145]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Konst_One
это настраивается под правами админа в настройках IE

Так в том-то и дело, что Fiddler как раз эти настройки в момент запуска и меняет, а при закрытии возвращает.
Может MSSQL перезапустить надо, чтобы он изменения подхватил, я не знаю.
10 сен 15, 17:41    [18134159]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Yuri Abele, переписал

DECLARE	@OLEObject			Int
		,@HTTPStatus		Int
		,@ErrCode			Int
		,@ErrMethod			SysName
		,@ErrSource			SysName
		,@ErrDescription	SysName

declare @url nvarchar(3890)
set @url = 'http://http.mnogosms.com:8000/send1'

EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @OLEObject OUT

IF (@ErrCode = 0)
BEGIN
  EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'open',NULL ,'GET' ,@url ,'false'	
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'open'	GOTO Error END
  
  EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'send',NULL ,NULL			
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'send'	GOTO Error END
  
  EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'status' ,@HTTPStatus OUT	
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'status'	GOTO Error END

  IF (@HTTPStatus = 200)
  BEGIN
    SET TEXTSIZE 2147483647;
    DECLARE	@Response TABLE ( Response varbinary(max) )
	INSERT	@Response
	  EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'responseBody'		IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'responseText'GOTO Error END
	
	SELECT * FROM @Response
	
  END 
  ELSE
    SELECT
      @ErrMethod	= 'send'
	  ,@ErrSource	= 'spSOAPMethod'
	  ,@ErrDescription= 'Ошибочный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'

  GOTO Destroy
  Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEObject ,@ErrSource OUT ,@ErrDescription OUT
  Destroy:EXEC @ErrCode = sys.sp_OADestroy @OLEObject

  IF (@ErrSource IS NOT NULL) 
  BEGIN
    RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescription)
    PRINT @@Error
  END
END 
ELSE 
BEGIN
  RAISERROR('Ошибка при создании OLE объекта "MSXML2.ServerXMLHTTP"',18,1)
  PRINT	@@Error
END


На "EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'send',NULL ,NULL" MSSQL задумывается, как будто файл заливается, но в Fiddler всё тихо(((
Это готовый код на получение rar файла, если не сложно посмотрите, у Вас этот скрипт будет отрабатывать, файл зальёт?
10 сен 15, 17:55    [18134231]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Если проверять то, заменить надо на

set @url = 'https://http.mnogosms.com:8001/send1'


иначе http работает только для определённых IP, https для всех
10 сен 15, 17:59    [18134266]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Трость,
Мне кажется там в самом деле косяк на больших размерах в реализации методов и бесполезно.
Рядом с БД предлагаю разместить скрипт, скачивающий и сохраняющий файлы на SQL сервер.
Все просто:
На стороне БД
+
-- здесь будут полученные файлы
CREATE TABLE [dbo].[T_test](
	[idrec] [int] IDENTITY(1,1) NOT NULL,
	[URL] [varchar](max) NULL,
	[FileContent] [image] NULL,
	[FileSize] [bigint] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
-----------процедура принимает и сохраняет файлы в табличку-------------------------------------------------------------
CREATE PROCEDURE SaveFileFromURL(
@URL  varchar (8000),
@FileSize int,
@FileData image 
)AS
BEGIN
------------------------------------
	INSERT INTO [T_test]([URL],[FileContent],[FileSize])  select @URL,@FileData,@FileSize
-----------------------------------------------
END

SELECT *  FROM [T_test]

Cоздайте файл с расширением vbs и таким содержимым,
поставьте его в назначенные задания выполняться.
Заполните правильно строку подключения к БД и URL к файлу.
+
'HTTPGETFile "Provider=SQLOLEDB.1;Password=xxxx;Persist Security Info=True;User ID=xxxx;Initial Catalog=xxxx;Data Source=127.0.0.1,1433", "http://192.168.0.10/some.rar"

'---------------------------------------------'
Sub HTTPGETFile(strConnection, strURL)


Dim oXMLHTTP, oADOStream 
Dim c

Dim prmFromURL
Dim prmFileSize
Dim prmFileData
Dim Cmd
Dim fso
Dim FileContents
Dim File

' скачиваем файл'
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set oADOStream = CreateObject("ADODB.Stream")

	oXMLHTTP.Open "GET", strURL, 0 
	oXMLHTTP.Send
	oADOStream.Mode = 3
	oADOStream.Type = 1
	oADOStream.Open
	oADOStream.Write oXMLHTTP.responseBody
	MsgBox oADOStream.Size ' покажем размер полученного файла'
	
' устанавливаем соединение с БД'
Set c = CreateObject("ADODB.Connection")
    c.Provider = "MSDASQL"
    c.CursorLocation = 3
    c.ConnectionString = strConnection
    c.Open
	
' вызываем хранимку для сохранения файла на сервере'   
Set prmFromURL = CreateObject("ADODB.Parameter")
    prmFromURL.Type = 200
    prmFromURL.Size = 8000
    prmFromURL.Direction = 1
    prmFromURL.Name = "@URL"
	prmFromURL.Value=strURL
    
Set prmFileSize = CreateObject("ADODB.Parameter")
    prmFileSize.Type = 3
    prmFileSize.Size = 3
    prmFileSize.Direction = 1
    prmFileSize.Name = "@FileSize"
    
Set Cmd =  CreateObject("ADODB.Command")
    Cmd.ActiveConnection = c
    Cmd.CommandText = "SaveFileFromURL"
    Cmd.CommandTimeout = 55
    Cmd.CommandType = 4
    
    Cmd.Parameters.Append prmFromURL
    Cmd.Parameters.Append prmFileSize
       
Set prmFileData = Cmd.CreateParameter(, 205, 1, (oADOStream.Size + 1))
    Cmd.Parameters.Append prmFileData

    oADOStream.Position=0
    prmFileData.AppendChunk oADOStream.Read
    prmFileSize.Value = oADOStream.Size

Cmd.Execute

    Set prmFromURL = Nothing
    Set prmFileSize = Nothing
    Set prmFileData = Nothing
	Set oADOStream = Nothing
	Set oXMLHTTP = Nothing
    Set Cmd = Nothing
    Set c = Nothing
	
  MSGBOX 'Загрузка файла в БД завершена'
End Sub

добавить обработку ошибок и логирование по вкусу, ну и MSGBOX убрать.
10 сен 15, 19:27    [18134585]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
ART-CODE,

Спасибо.
Мне уже тоже кажется, что с большими файлами тут не получится, обидно блин.
10 сен 15, 19:37    [18134638]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Господа эксперты, посмотрите у Вас будет идти закачка файла? Файл rar чуть более 6 мегабайт.
Я уже ни знаю что тут можно ещё добавить...

DECLARE	@OLEObject			Int
		,@HTTPStatus		Int
		,@ErrCode			Int
		,@ErrMethod			SysName
		,@ErrSource			SysName
		,@ErrDescription	SysName

declare @url nvarchar(3890)
set @url = 'https://http.mnogosms.com:8001/send1'

EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @OLEObject OUT

IF (@ErrCode = 0)
BEGIN
  EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'open',NULL ,'GET' ,@url ,'false'	
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'open'	GOTO Error END
  
  EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'send',NULL ,NULL			
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'send'	GOTO Error END
  
  EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'status' ,@HTTPStatus OUT	
  IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'status'	GOTO Error END

  IF (@HTTPStatus = 200)
  BEGIN
    SET TEXTSIZE 2147483647;
    DECLARE	@Response TABLE ( Response Image )
	INSERT	@Response
	  EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'responseBody'		IF (@ErrCode <> 0) BEGIN SET @ErrMethod = 'responseBody'GOTO Error END
	
	SELECT * FROM @Response
	
  END 
  ELSE
    SELECT
      @ErrMethod	= 'send'
	  ,@ErrSource	= 'spSOAPMethod'
	  ,@ErrDescription= 'Ошибочный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'

  GOTO Destroy
  Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEObject ,@ErrSource OUT ,@ErrDescription OUT
  Destroy:EXEC @ErrCode = sys.sp_OADestroy @OLEObject

  IF (@ErrSource IS NOT NULL) 
  BEGIN
    RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescription)
    PRINT @@Error
  END
END 
ELSE 
BEGIN
  RAISERROR('Ошибка при создании OLE объекта "MSXML2.ServerXMLHTTP"',18,1)
  PRINT	@@Error
END
11 сен 15, 07:21    [18135662]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Есть у меня CLR-функция для загрузки изображений.
 [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static byte[] DownloadImage(string imageUri)
        {
            WebClient imageWebClient = new WebClient();
            byte[] result;
            try
            {
                result = imageWebClient.DownloadData(imageUri);
            }
            catch (WebException)
            {
                return null;
            }
            return result;
        }
Соответственно, её отображение в T-SQL.
CREATE FUNCTION [dbo].[DownloadImage](@imageUri [nvarchar](max))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [ImageLoading].[ImageLoading.ImageProcessing].[DownloadImage]
Загрузила Ваш файлик за 7 секунд.
DECLARE @Image varbinary(max);

SET @Image = dbo.DownloadImage('https://http.mnogosms.com:8001/send1');

SELECT @Image
11 сен 15, 08:41    [18135761]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Лирический вопрос - если-таки пошли советы про внешние решения, то зачем изобретать что-то custom?
Почему в этом случае не воспользоваться готовым ETL продуктом, тем же SSIS?

(Или PDI? (18130930) - им будет немного проще, да иустановка его проще, если SSIS был еще не установлен.)
11 сен 15, 09:01    [18135813]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Yuri Abele,

Спасибо, тут есть пару моментов:

1. Уже просто из принципа интересно доделать на T-SQL. И ещё, что самое интересное, аналогичные вопросы на форуме задавали не раз и всегда оставались без ответа. Если найти решение, то данный топик будет полезен для будущих бесед.

2.Я понятие не имею, что такое SSIS и не знаю языка c# т.к. работа связала меня с Delphi (у нас студия XE6). И я тут даже не знаю с чего начать(((.

3.Понятия не имею как потом это разворачивать на других серверах, где работают начиная с MSSQL2005 заканчивая на MSSQL2014 в большинстве случаем Express редакциях.
11 сен 15, 09:15    [18135849]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Glory
Member

Откуда:
Сообщений: 104751
Трость
Уже просто из принципа интересно доделать на T-SQL. И ещё, что самое интересное, аналогичные вопросы на форуме задавали не раз и всегда оставались без ответа.

Потому что MSSQL не может влиять на внешние компоненты. А искать особенности конфигурации именно вашей системы никто не будет.

Трость
2.Я понятие не имею, что такое SSIS и не знаю языка c# т.к. работа связала меня с Delphi (у нас студия XE6). И я тут даже не знаю с чего начать(((.

Ну вот и пишите программу на Delphi
11 сен 15, 09:22    [18135867]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Трость,

а Вы опишите задачу полностью, тогда можно будет подумать как и чего по-эффективнее.

P.S. Судя по тому, сколько Вы времени угробили на этот топик оное (время) у вас есть, так и потратьте его на расковыривание отмирающих решений (использование COM библиотек из под T-SQL), а на изучение чего-то нового.
Если Вы больше в сторону BI смотрите - изучите ETL.
Если больше в сторону custom application development - .NET/C# и Visual Studio. C#, изначально создал тот же человек, что и Delphi (Anders Hejlsberg)
11 сен 15, 09:24    [18135876]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Glory,

Смотрю в сторону SSIS,
вопросы:
- SSIS пакеты будут работать на Express?
- SSIS пакет написанный допустим на 2005, будет работать на 2012, и наоборот?
11 сен 15, 13:12    [18137598]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Glory
Member

Откуда:
Сообщений: 104751
Трость
- SSIS пакеты будут работать на Express?

BOL - Features Supported by the Editions of SQL Server

Трость
- SSIS пакет написанный допустим на 2005, будет работать на 2012, и наоборот?

Это же не exe, который ни от чего не зависит
11 сен 15, 13:17    [18137630]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Glory,

т.е. на оба вопроса - нет?

если не ssis, то что ещё можно посмотреть в моём случае?
11 сен 15, 13:26    [18137709]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Glory
Member

Откуда:
Сообщений: 104751
Трость
т.е. на оба вопроса - нет

Не правильно

Трость
если не ssis, то что ещё можно посмотреть в моём случае?

Программу на Delphi
11 сен 15, 13:28    [18137719]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Glory
Трость
т.е. на оба вопроса - нет

Не правильно

Трость
если не ssis, то что ещё можно посмотреть в моём случае?

Программу на Delphi


ой точнее на второй вопрос "нет"... а вот если есть зависимость пакета от редакции MSSQL то тогда не подойдёт...


про Delphi - это я на "посошок" оставлю))))
11 сен 15, 13:32    [18137750]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Glory
Member

Откуда:
Сообщений: 104751
Трость
ой точнее на второй вопрос "нет"... а вот если есть зависимость пакета от редакции MSSQL то тогда не подойдёт...

Перенос чего-либо на другую вресию называется миграцией.
И она не происходит автоматически.
И SSIS - это не MSSQL

Трость
про Delphi - это я на "посошок" оставлю))))

А вы там код тестируете так же, как и скрипт на TSQL - в браузере ?
11 сен 15, 13:35    [18137773]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Трость
если не ssis, то что ещё можно посмотреть в моём случае?

PDI : 18130930
плюсы в Вашем случае:
- независим от версии и редакции MSSQL
11 сен 15, 13:43    [18137828]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Jovanny
Есть у меня CLR-функция для загрузки изображений.
 [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static byte[] DownloadImage(string imageUri)
        {
            WebClient imageWebClient = new WebClient();
            byte[] result;
            try
            {
                result = imageWebClient.DownloadData(imageUri);
            }
            catch (WebException)
            {
                return null;
            }
            return result;
        }
Соответственно, её отображение в T-SQL.
CREATE FUNCTION [dbo].[DownloadImage](@imageUri [nvarchar](max))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [ImageLoading].[ImageLoading.ImageProcessing].[DownloadImage]
Загрузила Ваш файлик за 7 секунд.
DECLARE @Image varbinary(max);

SET @Image = dbo.DownloadImage('https://http.mnogosms.com:8001/send1');

SELECT @Image


Jovanny, спасибо,
Ваш вариант, похоже, самый идеальный.

Пока не силён в c#,
1.Вы можете скинуть полный вариант crl функции с "using", "public class" и т.п.?
2.Я правильно понимаю, загруженная сборка crl в базу (MSSQL2008R) может быть перемещена на другой сервер через тот-же бэкап?
12 сен 15, 16:40    [18142199]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Доброго дня суток.

Установил crl сборку. Но при вызове, пишет следующее:

Сообщение 6522, уровень 16, состояние 1, строка 3
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или агрегатной функции "DownloadImage": 
System.Security.SecurityException: Сбой при запросе разрешения типа "System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
System.Security.SecurityException: 
   в System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   в System.Net.WebClient.DownloadData(Uri address)
   в HttpFunctions.DownloadImage(String imageUri)


Подскажите что может быть?
13 сен 15, 16:46    [18144028]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Трость,

1. Проверьте в свойствах базы, чтобы Ваша база была TRUSTWORTHY ON.
Если нет, выполните
ALTER DATABASE <your base> SET TRUSTWORTHY ON;

2. Дайте Вашей сборке права на доступ вовне.
ALTER ASSEMBLY <your assembly> WITH PERMISSION_SET = EXTERNAL_ACCESS
14 сен 15, 08:18    [18145163]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Трость
1.Вы можете скинуть полный вариант crl функции с "using", "public class" и т.п.?

using System.Net;
using Microsoft.SqlServer.Server;

namespace ImageLoading {
    public static class ImageProcessing {

        [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static byte[] DownloadImage(string imageUri)
        {
            WebClient imageWebClient = new WebClient();
            byte[] result;
            try
            {
                result = imageWebClient.DownloadData(imageUri);
            }
            catch (WebException)
            {
                return null;
            }
            return result;
        }
    }
}



Трость
2.Я правильно понимаю, загруженная сборка crl в базу (MSSQL2008R) может быть перемещена на другой сервер через тот-же бэкап?
Да, сборка стала неотъемлемой частью базы и теперь будет с нею, пока Вы её не удалите.
14 сен 15, 08:25    [18145169]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Jovanny
Трость,

1. Проверьте в свойствах базы, чтобы Ваша база была TRUSTWORTHY ON.
Если нет, выполните
ALTER DATABASE <your base> SET TRUSTWORTHY ON;

2. Дайте Вашей сборке права на доступ вовне.
ALTER ASSEMBLY <your assembly> WITH PERMISSION_SET = EXTERNAL_ACCESS


Огромное спасибо за Вашу идею и помощь,
вчера сам разобрался со всем касаемо сборки, прав и установки)))
Сейчас делаю заключительные тесты, пока всё ок)))
14 сен 15, 08:29    [18145175]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных через http протокол  [new]
Трость
Guest
Jovanny,

Возник ещё один вопрос, а есть антологичная clr функция, но на отправку файла http серверу?
14 сен 15, 14:04    [18146736]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6] 7   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить