#xml #database #ms-access #data-transfer #dts
#xml #База данных #ms-access #передача данных #dts
Вопрос:
Я пытаюсь экспортировать большую базу данных Access .mdb в базу данных SQL Server и столкнулся с проблемой, когда Microsoft DTS не распознает тип данных определенного типа поля в базе данных access.
Я взглянул на соответствующие таблицы access, и они настроены как «текст» длиной 1. Они содержат единственное значение Y или N, если они заполнены, но также могут иметь значение null.
Я тестировал на одной таблице, которая содержит поле этого типа. Когда я открываю экран «Редактировать сопоставление», тип данных устанавливается равным -1, поэтому я вручную устанавливаю для него тип char длиной 1 и пытаюсь обработать таблицу. При этом выдается следующее сообщение об ошибке:
[Source Information]
Source Location : C:adminfacdata.mdb
Source Provider : Microsoft.Jet.OLEDB.4.0
Table: `ACASSCATDEPREC`
Column: DepBook
Column Type: 130
SSIS Type: (Type unknown ...)
Mapping file (to SSIS type): c:Program FilesMicrosoft SQL Server100DTSMappingFilesJetToSSIS.xml
[Destination Information]
Destination Location : SERVERNAME
Destination Provider : SQLOLEDB
Table: [dbo].[ACASSCATDEPREC]
Column: DepBook
Column Type: char
SSIS Type: string [DT_STR]
Mapping file (to SSIS type): c:Program FilesMicrosoft SQL Server100DTSMappingFilesMSSQLToSSIS10.XML
[Conversion Steps]
Conversion unknown ...
SSIS conversion file: c:Program FilesMicrosoft SQL Server100DTSbinnDtwTypeConversion.xml
Я читал различные блоги, и кажется, что мне нужно отредактировать файлы сопоставления xml, чтобы указать DTS, какой тип данных 130 должен быть, поэтому я отредактировал файлc:Program Файлы Microsoft SQL Server100DTSMappingFilesJetToSSIS.xml и запустил его снова, но это не имело никакого значения.
Я добавил это в файл сопоставления xml, а затем перезапустил программу и повторил попытку:
<dtm:DataTypeMapping >
<dtm:SourceDataType>
<dtm:DataTypeName>Char</dtm:DataTypeName>
</dtm:SourceDataType>
<dtm:DestinationDataType>
<dtm:CharacterStringType>
<dtm:DataTypeName>130</dtm:DataTypeName>
<dtm:Length>1</dtm:Length>
</dtm:CharacterStringType>
</dtm:DestinationDataType>
</dtm:DataTypeMapping>
Тот факт, что я получил точно такую же ошибку, как и раньше, заставил меня поверить, что редактирование других файлов сопоставления ничего не изменит.
У кого-нибудь есть идеи?
Комментарии:
1. Это одноразовая операция или что-то, что должно быть доступно сценарию? Если это одноразовый импорт, рассмотрите помощник по миграции SQL Server для Access, который на сегодняшний день является наиболее универсальным инструментом для изменения размера с Jet / ACE на SQL Server.
Ответ №1:
Чтобы уточнить это, если вы решите пойти по маршруту xml, файлы, которые вам нужно будет отредактировать для доступа к MSSQL, следующие:
%ProgramFiles%Microsoft SQL Server [Ваша версия] DTS MappingFiles
Добавьте следующее в JetToMSSql8.xml и JetToMSSql9.xml
<!-- 130 -->
<dtm:DataTypeMapping >
<dtm:SourceDataType>
<dtm:DataTypeName>130</dtm:DataTypeName>
</dtm:SourceDataType>
<dtm:DestinationDataType>
<dtm:CharacterStringType>
<dtm:DataTypeName>nvarchar</dtm:DataTypeName>
<dtm:UseSourceLength/>
</dtm:CharacterStringType>
</dtm:DestinationDataType>
</dtm:DataTypeMapping>
И в JetToSSIS.xml
<!-- 130 -->
<dtm:DataTypeMapping >
<dtm:SourceDataType>
<dtm:DataTypeName>130</dtm:DataTypeName>
</dtm:SourceDataType>
<dtm:DestinationDataType>
<dtm:CharacterStringType>
<dtm:DataTypeName>DT_WSTR</dtm:DataTypeName>
<dtm:UseSourceLength/>
</dtm:CharacterStringType>
</dtm:DestinationDataType>
</dtm:DataTypeMapping>
JetToMSSql *.xml поможет сопоставить эти поля «короткого текста» в Access с типом данных nvarchar в MSSQL. У меня сложилось впечатление, что на самом деле они хранятся как NChar внутри Access, но для большинства целей решение с переменной, вероятно, подойдет. The JetToSSIS.xml затем тип данных преобразуется в широкую строку, как и следовало ожидать. После обновления этих файлов мастера SSIS будут обрабатывать такие столбцы в обычном режиме.
Ответ №2:
Возможно, к настоящему времени вы получили более крупные и качественные сообщения об ошибках, но я столкнулся с той же проблемой при попытке импортировать .mdb в SQL 2008 R2 с помощью мастера импорта. Несколько полей, которые были настроены как текст в файле mdb, выдавали ошибку «тип исходных данных 130 не найден в файле сопоставления». Я отследил длину текстового поля в файле mdb. Любое текстовое поле, размер которого был установлен меньше 30, выдавало ошибку. В файле mdb я увеличил размер всех текстовых полей как минимум до 30, а затем я смог импортировать базу данных.
Комментарии:
1. Именно в этом и заключалась моя проблема. Спасибо за ответ!
2. У меня также была
Source data type 130 was not found in the mapping file
ошибка, но все столбцы имели длину поля 50. Я изменил их на 51, и проблема была решена3. Отличная работа @Janet Laugel. Я изменил любое поле, которое выдает ошибку, на длинный текст в access, и это сработало.
Ответ №3:
Ответ на проблему 130 для меня заключался не в длине поля 30 или более — это тот факт, что вы ИЗМЕНЯЕТЕ длину поля в Access 2003 или выше. (Я изменил свой на 100, оставив только некоторые с длиной 50 — они продолжали выдавать ошибку 130 — поэтому я изменил их все на 100) Я думаю, что моя проблема возникла из-за копирования пары таблиц из базы данных Access 97. У меня есть сотни полей в других таблицах, которые не вызывали проблем, даже если они могли иметь длину 16
Ответ №4:
Я импортировал данные с помощью мастера импорта и экспорта SQL Server из SSMS и столкнулся с той же проблемой. Я попробовал решение @Avarkx, но безуспешно. Но потом я понял, что у самой SSMS есть свои собственные версии JetToMSSql8.xml , JetToMSSql9.xml и JetToSSIS.xml файлы, которые расположены в [SSMS_Install_Path] Common7 IDE CommonExtensions Microsoft SSIS [Номер версии SQL Server] MappingFiles Когда я применил решение @Avarkx к этим файлам, оно начало работать без ошибок.
Ответ №5:
Вам нужно отредактировать 3 файла:
- IBMDB2ToSSIS10.xml
- JetToSSIS.xml
- DtwTypeConversion.xml
Скопируйте любой тип текста и замените исходный текст на 130 и конечный ntext. Для меня работает идеально.
Ответ №6:
Поле, в котором возникает эта проблема, имеет тип 10 (текст в DAO 3.6) и атрибут
- Атрибут должен быть
- Смотрите свойства полей в DAO 3.6. Тип 130 относится к ADO.