Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 202

Режет количество символов в результате

24.12.2016, 01:14. Показов 1688. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая функция, которая принимая URL должна возвращать результат 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
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);
        }


Но она возвращает только около 4463 символов и обрезает строку на этой позиции
В чем может быть проблема? String не должен вроде резать такое количество символов
На стороне SQL Server вроде нет никаких ограничений
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2016, 01:14
Ответы с готовыми решениями:

Вставка содержимого поля MEMO в Excel. Режет до 256 символов
Возникла следующая проблема. Вставляю в подготовленный шаблон Excel формата 97-2009 содержимое запроса, где есть поля типа MEMO. Вставляю...

Дана последовательность символов, в начале которой имеется некоторое количество одинаковых символов. Определить это количество
8.10.2. Помогите, пожалуйста, решить задачу в С++. Дана последовательность символов, в начале которой имеется некоторое...

Найти количество символов всех строк файла и количество символов в определенной строке
Здравствуйте! Я хотел бы попросить помощи в решении задачки! У меня не получается найти количество символов всех строчек и количество...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
24.12.2016, 07:35
googlogmob, как ты это проверяешь? Случайно не через SSMS? Он обрезает длинные строки при выводе.
0
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 202
24.12.2016, 15:12  [ТС]
Сначала через SSMS как раз и проверял.
Пробовал добавить в настройках больший объем памяти для результата. Но это не помогло. Потом просто выгрузил результат этого http-запроса через PowerShell в файл .json. Выгрузились все строки. Потом попробовал считать SQL Server'ом с этого файла при помощи bulk в поля с типом данных nvarchar(max) и text. И sql server обрезал результат! То есть не в функции на C# проблема, а оказалось, что в самом SQL server. Такое впечатление что на длину символов есть ограничение или оно срабатывает при записи или чтении с поля. Считывал функцией OPENJSON. Она возвращает ошибку что не полная строка, нарушена схема. То есть даже не в окне результата в SSMS, а даже при обращении в строке.

Подскажите пожалуйста, хоть уже и не по ветке, в чем может быть причина что SQL Server режет длину строки? Может есть другой вариант обрабатывать длинную строку JSON?
0
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 202
26.12.2016, 02:03  [ТС]
Вот 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
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 = 500000;
            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)"))}
                    )
                  ");
 
                    db.Execute($@"
                    {string.Join(Environment.NewLine,
                       rows.Select(
                       row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                 ");
 
                }
 
                db.Execute($@"
                    {string.Join(Environment.NewLine,
                    rows.Select(
                        row => $"INSERT INTO {tableName} VALUES ({string.Join(", ", row.Select(r => $"N'{r}'"))});"))}
                ");
 
            }
        }


Единственное, не решена проблема с таймаутом запроса
0
5 / 5 / 5
Регистрация: 17.12.2013
Сообщений: 202
26.12.2016, 02:28  [ТС]
Вот готовое решение: 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) = 'htt'
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
Вложения
Тип файла: rar DLL.rar (723.8 Кб, 1 просмотров)
Тип файла: rar SqlWebRequest.rar (3.58 Мб, 1 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2016, 02:28
Помогаю со студенческими работами здесь

Найти количество символов в строке, найти заданные буквы, разделить количество букв на количество символов
Написать код который сперва подсчитывает количество символов в строке а потом из этих находит буквы (a,e,y,u,i) и делит количество букв на...

Количество строк в результате запроса
Подскажите пожалуйста, как узнать сколько значений вернет запрос? Вот код table.Clear(); MySqlConnection con = new...

Количество элементов в результате запроса
сделал простенький запрос на вывод полей где есть определенное значение, а как сделать подсчет количества полей которые вывелись ? ...

Вывести количество по разным where в одном результате
Сложно сформулировать, потому сразу пример: денег вася 1 вася 2 вася 3 иван 4 иван 5 иван 6 вот исходная таблица, нужно...

Количество значащих цифр в полученном результате
Приветствую всех форумчан. Только начинаю разбираться в Scilab'е и никак понять не могу, что обозначает запись числа в следующем виде:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru