Я предполагаю, что это из-за "продолжения строки" SQL Server. Пробовал разными методами, ничего не помогает. Мне интересно, есть ли способ указать моей хранимой процедуре не выполнять этого или остановить эту функцию на сервере, или есть ли другие способы обойти это, не требующие каких-либо изменений в данных.
Мы используем преобразование ASCII на клиенте в C#
Код: Выделить всё
Encoding.ASCII.GetString(Blob, 0, Blob.Length).Replace("'", "''")
На сервере мы конвертируем строку в varbinary с помощью
Код: Выделить всё
CONVERT(VARBINARY(MAX), (@BLOB))
Код: Выделить всё
Convert.ToBase64String(BLOB)
Мы не можем отказаться от агрегации, так как это необходимо для обеспечения более плавной работы серверов и сохранения строки заняло бы больше места, чем необходимо.
Любая информация об этом приветствуется.
Изменить
Много люди в комментариях смущены этим вопросом, и я могу это понять. Я постараюсь ответить на вопрос «почему», даже если он не имеет никакого отношения к моему вопросу 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)
Мы находимся на этапе принятия решения: следует ли нам просто пропустить преобразование его в массив байтов на сервере и вместо этого сохранить его как varchar(max), или нам следует продолжать борьбу, чтобы найти решение, которое сохранится это как массив байтов поэтому пользователи могут просто загрузить его без каких-либо преобразований. Под «мы» я имею в виду моего наставника, который вошел в этот проект одной ногой, и меня.
Как упоминалось ранее, любые знания об этом приветствуются
Подробнее здесь: https://stackoverflow.com/questions/758 ... ion-in-sql
Мобильная версия