Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
googlogmob
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 200
1

Функция отправки GET запросов и парсинг JSON-строки в таблицу

23.12.2016, 19:29. Просмотров 778. Ответов 3
Метки нет (Все метки)

Добрый день
Есть функция, которая отправляет http-запросы и возвращает результат в виде строки

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Globalization;
 
// For the SQL Server integration
using Microsoft.SqlServer.Server;
 
// Other things we need for WebRequest
using System.Net;
using System.Text;
using System.IO;
 
namespace SqlWebRequest
{
    public partial class Functions
    {
        // Function to return a web URL as a string value.
        [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
        public static SqlString GET(SqlString uri, SqlString username, SqlString passwd)
        {
            // The SqlPipe is how we send data back to the caller
            SqlPipe pipe = SqlContext.Pipe;
            String document;
 
            // Set up the request, including authentication
            WebRequest req = WebRequest.Create(Convert.ToString(uri));
            if (Convert.ToString(username) != null & Convert.ToString(username) != "")
            {
                req.Credentials = new NetworkCredential(
                    Convert.ToString(username),
                    Convert.ToString(passwd));
            }
            ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";
 
            // Fire off the request and retrieve the response.
            // We'll put the response in the string variable "document".
            WebResponse resp = req.GetResponse();
            Stream dataStream = resp.GetResponseStream();
            StreamReader rdr = new StreamReader(dataStream);
            document = (String)rdr.ReadToEnd();
 
            // Close up everything...
            rdr.Close();
            dataStream.Close();
            resp.Close();
 
            // .. and return the output to the caller.
            return (document);
        }
   }
}


В моем случае я получаю JSON-строку такой структуры:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "response":
    {
        "uri":"\/api\/z",
        "action":"EXPORT",
        "result":
        {
            "column_order":["CONTACTID","ФИО","Контакт - ответственный"],
                "rows":[
                    ["1874394000001482787","Светлана..","Контакты"],
                    ["1874394000001482788","Светлана..","Контакты"],
                    ["1874394000001482789","Maria..","База"]
                    ]
        }
    }
}
Помогите пожалуйста распарсить эту строку и поместить результат во временную таблицу с названиями полей как в "column_order"

Хочу данные с этой временной таблицы потом залить в таблицу SQL Server
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2016, 19:29
Ответы с готовыми решениями:

Парсинг строки json
Укажите пожалуйста на ошибку: Структура JSON файла: { "threads":, ...

Способы отправки запросов в инет
Добрый день, пишу на c#, есть сайт смысл в том чтобы прога отправляла post...

Бан на ресурсе после отправки 200 POST запросов
Добрый день, всем! Написал просенькую программу, которая отправляет post-запрос...

Создать командную строку из RichTextBox для отправки запросов в БД
Добрый вечер! Я хочу организовать командную строку с помощью RichTextBox....

Программа для отправки GET запросов работает только в отладочном режиме
Программа должна отправлять запросы по указанной ссылке , можно указать период...

3
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
24.12.2016, 21:38 2
В чем сложности? Обычная работа со строками.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
namespace ConsoleApplication271
{
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using Dapper;
    using Newtonsoft.Json.Linq;
 
    internal class Program
    {
        private static void Main()
        {
            var json = JObject.Parse(GetResponse());
 
            var tableName = "#FooTable";
            var colums = json["response"]["result"]["column_order"];
            var rows = json["response"]["result"]["rows"];
            var connectionString = @"Data Source=192.168.1.52;Initial Catalog=TestDb;User ID=sa; Password=zxc12EE";
 
            using (IDbConnection db = new SqlConnection(connectionString))
            {
                db.Execute($@"
                    create table {tableName}
                    (
                        {string.Join("," + Environment.NewLine, colums.Select(colum => $"[{colum}] NVARCHAR(MAX)"))}
                    )
                ");
 
                db.Execute($@"
                    {string.Join(Environment.NewLine,
                    rows.Select(
                        row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                ");
 
            }
        }
 
        private static string GetResponse()
        {
            return @"{
   ""response"":{
      ""uri"":""\/api\/z"",
      ""action"":""EXPORT"",
      ""result"":{
         ""column_order"":[
            ""CONTACTID"",
            ""ФИО"",
            ""Контакт - ответственный""
         ],
         ""rows"":[
            [
               ""1874394000001482787"",
               ""Светлана.."",
               ""Контакты""
            ],
            [
               ""1874394000001482788"",
               ""Светлана.."",
               ""Контакты""
            ],
            [
               ""1874394000001482789"",
               ""Maria.."",
               ""База""
            ]
         ]
      }
   }
}";
        }
    }
}
0
Вложения
Тип файла: zip ConsoleApplication271.zip (4.6 Кб, 3 просмотров)
googlogmob
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 200
26.12.2016, 02:13  [ТС] 3
_exp10der_, Огромное спасибо за код
А как этот код консольного приложения преобразовать в код для dll?
Мне нужно подключать эту функцию в SQL Server (CLR)

Добавил Ваш код к коду моей dll

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Globalization;
 
// For the SQL Server integration
using Microsoft.SqlServer.Server;
 
// Other things we need for WebRequest
using System.Net;
using System.IO;
 
using System.Linq;
using Dapper;
using Newtonsoft.Json.Linq;
 
namespace SqlWebRequest
{
    public partial class Functions
    {
        // Function to return a web URL as a string value.
        [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
        public static void GET(SqlString uri, SqlString username, SqlString passwd, String CONNstring, String TABLEname)
        {
            // The SqlPipe is how we send data back to the caller
            SqlPipe pipe = SqlContext.Pipe;
            String document;
 
            // Set up the request, including authentication
            WebRequest req = WebRequest.Create(Convert.ToString(uri));
            if (Convert.ToString(username) != null & Convert.ToString(username) != "")
            {
                req.Credentials = new NetworkCredential(
                    Convert.ToString(username),
                    Convert.ToString(passwd));
            }
            ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";
 
            // Fire off the request and retrieve the response.
            // We'll put the response in the string variable "document".
            WebResponse resp = req.GetResponse();
            Stream dataStream = resp.GetResponseStream();
            StreamReader rdr = new StreamReader(dataStream);
            document = (String)rdr.ReadToEnd();
 
            // Close up everything...
            rdr.Close();
            dataStream.Close();
            resp.Close();
 
            // .. and return the output to the caller.
            //return (document);
            Parsing(document, CONNstring, TABLEname);
        }
 
 
        private static void Parsing(String JSONstring, String CONNstring, String TABLEname)
        {
            var json = JObject.Parse(JSONstring);
 
            var tableName = TABLEname; // "#FooTable";
            var colums = json["response"]["result"]["column_order"];
            var rows = json["response"]["result"]["rows"];
            var connectionString = CONNstring; // @"Data Source=";
 
            using (IDbConnection db = new SqlConnection(connectionString))
            {
                db.Execute($@"
                    create table {tableName}
                    (
                        {string.Join("," + Environment.NewLine, colums.Select(colum => $"[{colum}] NVARCHAR(MAX)"))}
                    )
                ");
 
                db.Execute($@"
                    {string.Join(Environment.NewLine,
                    rows.Select(
                        row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                ");
 
            }
        }
   }
}


Дело в том, что при подключении этой dll в SSMS возникает сообщение, что нужно дополнительно подключать библиотеки
Несколько библиотек попробовал расположить в папке с моим DLL, но SQL Server ругается

Если получится разместить оба эти блока кода (http-запросов и json- парсер) в одном dll - задача была бы решена
Или может можно как-то выгрузить все используемые в этом коде dll, чтобы SQL Server не ругался?

Добавлено через 9 часов 1 минуту
Подскажите пожалуйста как указать таймаут выполнения SQL запроса?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 private static void Main()
        {
            var json = JObject.Parse(GetResponse());
 
            var tableName = "#FooTable";
            var colums = json["response"]["result"]["column_order"];
            var rows = json["response"]["result"]["rows"];
            var connectionString = @"Data Source=192.168.1.52;Initial Catalog=TestDb;User ID=sa; Password=zxc12EE";
 
            using (IDbConnection db = new SqlConnection(connectionString))
            {
                db.Execute($@"
                    create table {tableName}
                    (
                        {string.Join("," + Environment.NewLine, colums.Select(colum => $"[{colum}] NVARCHAR(MAX)"))}
                    )
                ");
 
                db.Execute($@"
                    {string.Join(Environment.NewLine,
                    rows.Select(
                        row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                ");
 
            }
        }
Добавлено через 19 минут
Ловлю в SSMS такое вот сообщение

сообщение: 6522, уровень: 16, состояние: 1, процедура: fn_get_webrequest, строка: 0 [строка начала пакета: 39]
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или агрегатной функции "fn_get_webrequest":
System.Data.SqlClient.SqlException: Истекло время ожидания (Timeout). Время ожидания истекло до завершения операции или сервер не отвечает. ---> System.ComponentModel.Win32Exception: Время ожидания операции истекло
System.ComponentModel.Win32Exception:
0
googlogmob
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 200
26.12.2016, 02:28  [ТС] 4
Вот готовое решение: DLL с функциями отправки http-запроса, парсинга результата-json и запись в таблицу SQL Server

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Globalization;
 
// For the SQL Server integration
using Microsoft.SqlServer.Server;
 
// Other things we need for WebRequest
using System.Net;
using System.Text;
using System.IO;
using System.Linq;
using Dapper;
using Newtonsoft.Json.Linq;
 
 
 
namespace SqlWebRequest
{
    public partial class Functions
    {
        // Function to return a web URL as a string value.
        [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
        public static void GET(SqlString uri, SqlString username, SqlString passwd, String Table_Name, String Connection_String, Boolean Create_Table)
        {
            // The SqlPipe is how we send data back to the caller
            SqlPipe pipe = SqlContext.Pipe;
            String document;
 
            // Set up the request, including authentication
            WebRequest req = WebRequest.Create(Convert.ToString(uri));
            if (Convert.ToString(username) != null & Convert.ToString(username) != "")
            {
                req.Credentials = new NetworkCredential(
                    Convert.ToString(username),
                    Convert.ToString(passwd));
            }
            ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";
 
            // Fire off the request and retrieve the response.
            // We'll put the response in the string variable "document".
            WebResponse resp = req.GetResponse();
            req.Timeout = 50000;
            Stream dataStream = resp.GetResponseStream();
            StreamReader rdr = new StreamReader(dataStream);
            document = (String)rdr.ReadToEnd();
 
            // Close up everything...
            rdr.Close();
            dataStream.Close();
            resp.Close();
 
            // .. and return the output to the caller.
            // return (document);
            Parsing(document, Table_Name, Connection_String, Create_Table);
        }
 
 
        private static void Parsing(String Json_String, String Table_Name, String Connection_String, Boolean Create_Table)
        {
            var json = JObject.Parse(Json_String);
 
            var tableName = Table_Name;
            var colums = json["response"]["result"]["column_order"];
            var rows = json["response"]["result"]["rows"];
            var connectionString = Connection_String; //@"Data Source=192.168.1.52;Initial Catalog=TestDb;User ID=sa; Password=zxc12EE";
 
            using (IDbConnection db = new SqlConnection(connectionString))
            {
                if(Create_Table == true)
                {
                    db.Execute($@"
                    create table {tableName}
                    (
                        {string.Join("," + Environment.NewLine, colums.Select(colum => $"[{colum}] NVARCHAR(MAX)"))}
                    )
                  ", commandTimeout: 600);
 
                    db.Execute($@"
                    {string.Join(Environment.NewLine,
                       rows.Select(
                       row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                 ", commandTimeout: 600);
 
                }
 
                db.Execute($@"
                    {string.Join(Environment.NewLine,
                    rows.Select(
                        row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                ", commandTimeout: 600);
 
            }
        }
    }
}


На стороне SQL Server нужно выполнить:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
USE [Zoho]
GO
CREATE ASSEMBLY [SqlWebRequest]
FROM 'C:\DLL\SqlWebRequest.dll'
WITH PERMISSION_SET=UNSAFE;
GO
 
USE [Zoho]
GO
CREATE PROCEDURE [dbo].[fn_get_webrequest](
     @uri                 nvarchar(MAX),
     @USER                nvarchar(255)=NULL,
     @passwd              nvarchar(255)=NULL,
     @TABLE_NAME          nvarchar(50)=NULL,
     @Connection_String   nvarchar(255)=NULL,
     @Create_Table        bit =NULL
 
)
AS
EXTERNAL NAME [SqlWebRequest].[SqlWebRequest.Functions].[GET];
 
 
--IF OBJECT_ID('fn_get_webrequest') IS NOT NULL DROP FUNCTION [fn_get_webrequest]
--GO
--USE [Zoho]
--GO
--CREATE FUNCTION [dbo].[fn_get_webrequest](
--     @uri        nvarchar(max),
--     @user       nvarchar(255)=NULL,
--     @passwd     nvarchar(255)=NULL
--)
--RETURNS nvarchar(max)
--AS
--EXTERNAL NAME [SqlWebRequest].[SqlWebRequest.Functions].[GET];  Guurtus$gd4
Вызывать таким образом:

SQL
1
2
3
4
5
DECLARE @URL NCHAR(300) = 'ht='
DECLARE @SQL_QUERY nvarchar(300) = 'SELECT * FROM "Счета"';
DECLARE @json nvarchar(MAX) = @URL + @SQL_QUERY;
 
EXEC [Zoho].[dbo].[fn_get_webrequest] @json, DEFAULT, DEFAULT, 'Счета', 'Data Source=;Initial Catalog=;User ID=; Password=', 0
При подключении сборки в SQL Server в папке C:\DLL
был такой перечень библиотек

Прикрепил проект библиотеки и нужные dll
0
Вложения
Тип файла: rar SqlWebRequest.rar (3.58 Мб, 8 просмотров)
Тип файла: rar DLL.rar (723.8 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2016, 02:28

Парсинг JSON
Итак что надо сделать: делем запрос на сервер,нам приходят числа через азпятые...

парсинг json от vk
Использую DataContractJsonSerializer и не понимаю как распарсить такой json: ...

Как получить из строки JSON токен используя JSON.NET?
Доброго времени суток, Господа. Поскажите пожалуйста. Я никогда не работал с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru