将Access数据库转换为SQL Microsoft DTS - 数据类型"130"不在映射文件中

TGu*_*ond 4 xml database ms-access dts data-transfer

我正在尝试将大型Access .mdb数据库导出到SQL Server数据库,并且一直遇到Microsoft DTS无法识别访问数据库中特定类型字段的数据类型的问题.

我查看了相关的访问表,并将它们设置为长度为1的"文本".如果填充,它们包含单个Y或N值,但也可以具有空值.

我一直在测试包含这种类型字段的单个表.当我打开"编辑映射"屏幕时,数据类型设置为-1,因此我手动将其设置为长度为1的char类型,并尝试处理该表.这会产生以下错误消息:

[Source Information]
Source Location : C:\admin\facdata.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 Files\Microsoft SQL Server\100\DTS\MappingFiles\JetToSSIS.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 Files\Microsoft SQL Server\100\DTS\MappingFiles\MSSQLToSSIS10.XML
    [Conversion Steps]
    Conversion unknown ...
    SSIS conversion file: c:\Program Files\Microsoft SQL Server\100\DTS\binn\DtwTypeConversion.xml
Run Code Online (Sandbox Code Playgroud)

我一直在阅读各种博客,似乎我需要编辑xml映射文件来告诉DTS应该是什么数据类型130所以我编辑了文件c:\ Program Files\Microsoft SQL Server\100\DTS\MappingFiles\JetToSSIS .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>
Run Code Online (Sandbox Code Playgroud)

事实上,我得到了与以前完全相同的错误,这让我相信编辑其他映射文件不会有所作为.

任何想法?

小智 8

要详细说明,如果选择转到xml路径,则需要编辑Access for MSSQL的文件如下:

%ProgramFiles%\ Microsoft SQL Server [您的版本]\DTS\MappingFiles \

将以下内容添加到JetToMSSql8.xmlJetToMSSql9.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>
Run Code Online (Sandbox Code Playgroud)

以及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>
Run Code Online (Sandbox Code Playgroud)

JetToMSSql*.xml将帮助将Access中的这些"短文本"字段映射到MSSQL中的nvarchar数据类型.我的印象是他们实际上是在内部存储为Access的NChar,但在大多数情况下,变量解决方案可能很好.然后JetToSSIS.xml将数据类型映射到宽字符串,正如您所期望的那样.随着这些文件的更新,SSIS向导将正常处理这些列.


小智 4

现在您可能已经看到了更大更好的错误消息,但我在尝试使用导入向导将 .mdb 导入 SQL 2008 R2 时遇到了同样的问题。mdb 文件中设置为文本的多个字段引发“在映射文件中找不到源数据类型 130”错误。我追踪到 mdb 文件中的文本字段长度。任何设置为小于 30 的文本字段都会引发错误。在 mdb 文件中,我将所有文本字段的字段大小增加到至少 30,然后就可以导入数据库了。