Удалить или заблокировать «Продолжение строки» в SQLC#

Место общения программистов C#
Ответить
Anonymous
 Удалить или заблокировать «Продолжение строки» в SQL

Сообщение Anonymous »

В настоящее время мы используем агрегацию запросов для всех наших транзакций SQL. Сейчас мы планируем добавить на сервер поддержку BLOB, а это означает, что нам придется преобразовать массив байтов в строку, чтобы ее можно было отправить вместе с запросом. Мы хотели бы иметь данные BLOB в виде массива байтов на сервере, но сервер, похоже, пропускает некоторые символы. Особенно '' и '[newline]'.
Я предполагаю, что это из-за "продолжения строки" SQL Server. Пробовал разными методами, ничего не помогает. Мне интересно, есть ли способ указать моей хранимой процедуре не выполнять этого или остановить эту функцию на сервере, или есть ли другие способы обойти это, не требующие каких-либо изменений в данных.
Мы используем преобразование ASCII на клиенте в C#

Код: Выделить всё

Encoding.ASCII.GetString(Blob, 0, Blob.Length).Replace("'", "''")
чтобы выполнить как можно меньше преобразований.
На сервере мы конвертируем строку в varbinary с помощью

Код: Выделить всё

CONVERT(VARBINARY(MAX), (@BLOB))
Я знаю, как

Код: Выделить всё

Convert.ToBase64String(BLOB)
решит эту проблему. Однако это также потребует от нас (Преобразовать байты в строку на клиенте) -> (Преобразовать строку в байты в SQL) -> (Преобразовать байты в строку на сервере или на клиенте) -> (Преобразовать строку в байт на клиенте) для загрузки и загрузки одного большого двоичного объекта на сервер и с сервера.
Мы не можем отказаться от агрегации, так как это необходимо для обеспечения более плавной работы серверов и сохранения строки заняло бы больше места, чем необходимо.
Любая информация об этом приветствуется.
Изменить
Много люди в комментариях смущены этим вопросом, и я могу это понять. Я постараюсь ответить на вопрос «почему», даже если он не имеет никакого отношения к моему вопросу OG. Будет много опечаток, так как я делаю это в нижнем белье в полночь, лежа в постели.
У нас есть программное обеспечение для тестирования, которое есть здесь и там. В основном они находятся на заводах на плохих компьютерах с очень ограниченным доступом в Интернет. На каждой станции может быть запущено определенное количество DUT (тестируемых устройств), на каждом из которых выполняется тест. Каждый тест состоит из определенного количества шагов, которые необходимо выполнить. Таким образом, может быть станция с 1 ДУ, имеющая 13 тестовых шагов, и может быть станция с 50 ДУ, имеющая 40 тестовых шагов. Они могут быть расположены в Китае, Польше, Канаде и т. д. (большинство компаний часто находятся в Европе и несколько на другом континенте).
У нас нет серверного программного обеспечения, поэтому все вставки становятся прямая инъекция (мы знаем, что это плохо, но это устаревший код 10-летней давности, и все в беспорядке, поскольку я одинокий полный рабочий день в этом проекте, хотя работаю всего 6 месяцев и никогда не мог поговорить с предыдущим одиноким полный рабочий день, потому что естественных причин). Из-за этого, а также из-за небольшого финансирования проекта я не буду пытаться вносить какие-либо кардинальные изменения.
Итак, проблема, как я слышал, заключалась в том, что при наличии 50 потоков, пытающихся вставить 13 отдельных шаговых объектов не просто перехватывали соединение с серверами, но и останавливали производство. Решением было «агрегирование запросов» (я думал, что это какая-то стандартная чушь SQL, поскольку я хочу помнить, что я читал об этом в комментариях к коду, но не нашел его), которое объединяет все в строку, которая затем обрабатывается на сервере. . Затем сервер разрежет его и отправит переменные всем хранимым процедурам (я всего лишь посланник, а не мастер SQL). И при этом нам также необходимо преобразовать Blob в строку, поскольку он привязан к шагу в тесте, а конвейер процесса похож на лабиринт, поэтому почти невозможно вернуть идентификатор, изменив вызовы.< /p>
Теперь я хочу изменить массив байтов blob в C# с помощью ascii, поскольку SQL Server использует обычное преобразование ascii, когда я преобразую его из varchar(max) в a варбинарий(макс). Проблема в том, что некоторые символы при этом загадочным образом исчезают, так как я не могу преобразовать байтовый массив обратно в zip при его загрузке с сервера. Сравнивая символы ascii один за другим, я обнаружил, что три символа (или шесть байтов) были удалены из массива байтов, который находился на сервере. В ASCII этими тремя символами являются '', '' и '\r', и все они появляются в конце своих строк.
Сравнивая эту находку с собственной документацией Microsoft по продолжению строки (это можно посмотреть здесь) Мне показалось, что эти случаи связаны между собой, поэтому я хотел бы отключить эту функцию, поскольку я не использую эту функцию.
Я также могу использовать< /p>

Код: Выделить всё

Convert.ToBase64String(BLOB)
поскольку эта проблема ни разу не возникала, даже при отправке файла размером 50 МБ. Может это и совпадение, но я верю, что он делает что-то, что предотвращает этот сценарий (хочу вспомнить, что я взял это у какого-то умника, который использовал этот метод по той же причине или что-то в этом роде). Проблема в том, что 1. строка становится очень большой (я думаю, в 2,6 раза больше, чем ascii) и 2. сервер не преобразует таким образом. Поэтому при приведении предполагается, что у меня есть строка ascii, а это означает, что байты на сервере будут представлять строку ascii Base64String, представляющую массив байтов, что создает множество преобразований.
Мы находимся на этапе принятия решения: следует ли нам просто пропустить преобразование его в массив байтов на сервере и вместо этого сохранить его как varchar(max), или нам следует продолжать борьбу, чтобы найти решение, которое сохранится это как массив байтов поэтому пользователи могут просто загрузить его без каких-либо преобразований. Под «мы» я имею в виду моего наставника, который вошел в этот проект одной ногой, и меня.
Как упоминалось ранее, любые знания об этом приветствуются

Подробнее здесь: https://stackoverflow.com/questions/758 ... ion-in-sql
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»