peskandritsa2 Ответов: 2

Как я могу вставить таблицу данных в SQL с помощью sqlbulkcopy, если поле datatable для типа string содержит более 10000 символов


Здравствуйте, коллеги-разработчики ! Я столкнулся с проблемой, когда мне нужно вставить Datatable из 1000000 строк (а их много в CSV-файлах) в SQL server. Я использую SqlBulkCopy для этой работы.
Проблема, с которой я сталкиваюсь, заключается в том, что одно из полей в объекте DataTable, то есть типа string, может содержать более 10000 символов. Таблица SQL Server имеет это поле, установленное как Nvarchar(MAX), чтобы соответствовать потребностям.
Увы, когда я пытаюсь вставить его, возникает исключение, и система сообщает мне, что данные будут усечены для конкретного поля, и поэтому операция останавливается.
Что странно, так это то, что поле базы данных не имеет проблем с обработкой размера (так как это Nvarchar(MAX) ).
Я где-то читал в MSDN, что строка содержит более 4000 символов (хотя база данных может ее обрабатывать), вам нужно явно установить объект string ????
Есть какие-нибудь мысли по этому поводу, пожалуйста ?

Если вам потребуются какие-либо дополнительные сведения по этому вопросу, пеласе, дайте мне знать.
Заранее спасибо.

Что я уже пробовал:

- Отображение полей в SqlBulkCopy
- Установка атрибутов для класса записей, который я использую для создания столбцов datatable (например, [StringLengthMax])
- Я использую библиотеку FileHelpers для чтения CSV-файла в DataTable.

Процесс работает нормально, если поле в таблице данных имеет длину <= 4000 символов.

2 Ответов

Рейтинг:
5

peskandritsa2

Я нашел обходной путь для этого, похоже, что SqlBulkCopy имеет там ограничение (жаль, что я ошибаюсь), касающееся длины поля. Что я сделал, так это собрал все длинные записи (после цикла for для их проверки) в новую таблицу данных, а затем для каждой строки в таблице данных я создал SQL-запрос, который был запущен против базы данных. Оказалось, что это сработало как шарм с минимальным влиянием на производительность.


Рейтинг:
1

CHill60

Если вам нужно использовать текстовые поля больше, чем nvarchar(MAX) попробуйте использовать ntext или текст[^]. Возможно, Вам также потребуется обратиться к Массовое копирование текстовых и графических данных[^]

Кроме того, подумайте, что вы можете сохранить этот текст в виде физического файла на сервере и только путь к нему в базе данных (это распространенный метод, используемый, например, для изображений)


W∴ Balboos, GHB

nvarchar(MAX) содержит все текстовые данные, которые вы могли бы разумно захотеть! По вашей собственной ссылке:

Важно! типы данных ntext, text и image будут удалены в будущей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте изменять приложения, которые в настоящее время их используют. Вместо этого используйте nvarchar(max), varchar(max) и varbinary(max).


Новые методы избавляют меня (по крайней мере) от необходимости использовать указатели SQL для внесения каких - либо изменений в эти поля-просто следуйте правилам и никогда не проходите через какой-либо другой тип (8K char limited), иначе произойдет усечение.

peskandritsa2

Столбец базы данных уже установлен как NVarchar(MAX) ...проблема в том, что строка не будет скопирована в столбец, и программа выдаст исключение...
тип string в коде, тип NVarchar(MAX) в базе данных. Не могли бы вы быть немного более конкретными, пожалуйста, относительно предыдущих ответов ?

CHill60

Я не уверен, что могу быть более конкретным - или вы хотели ответить Бальбусу? Я предложил изменить тип столбца на ntext - но имейте в виду, что в будущем он будет устаревшим. Мое предложение просто сохранить путь к текстовому файлу все еще остается в силе, и, на мой взгляд, это лучший вариант для вас.

peskandritsa2

Я хотел ответить @ Balboos. Из того, что я узнал, nvarchar(MAX) sotres достигает 4000 символов. Чтобы сохранить больше, чем это, он использует другую страницу на sql server. (Это пришло прямо от Microsoft MVP, специализирующегося на SQL server) к сожалению, кажется, что при использовании SqlBulkCopy это не так. Я не знаю, как это преодолеть.

CHill60

Чтобы хранить больше, чем это, он будет использовать другой тип! Да, пейджинг будет затронут, но ничто, а не только SqlBulkCopy, не может волшебным образом заставить 10 000 символов войти в поле из 4000 символов. Вам нужно будет пересмотреть структуру вашей базы данных - я уже дал вам одно предложение

Richard Deeming

Я думаю, вы оба меня неправильно поняли. :)

nvarchar(max) может содержать столько же текста, сколько ntext - чуть меньше 2,15 миллиарда символов.

Старое ntext тип всегда сохранял текст на отдельной странице. nvarchar(max) будет пытаться хранить данные встроенными в запись, пока длина текста не превысит 4000 символов. Как только вы перейдете этот предел, он автоматически переместит текст на отдельную страницу.

Нет никакого преимущества в использовании ntext над nvarchar(max), и много недостатков.

CHill60

Спасибо, что прояснили это :thumbsup:...Я все еще учусь после всех этих лет :-)