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

5
我正在尝试将一个大型Access .mdb数据库导出到SQL Server数据库,但是遇到了一个问题:Microsoft DTS无法识别Access数据库中特定类型字段的数据类型。
我查看了相关的Access表格,它们被设置为“文本”类型,长度为1。如果有值,则包含单个Y或N值,但也可以为空值。
我一直在测试包含此类型字段的单个表格。当我打开“编辑映射”屏幕时,数据类型设置为-1,因此我手动将其设置为char类型,长度为1,并尝试处理该表格。这会产生以下错误消息:
[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

我一直在阅读各种博客,看起来我需要编辑 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>

我遇到了和之前一模一样的错误,这让我觉得修改其他映射文件并不能解决问题。你们有什么想法吗?

这是一次性操作还是需要脚本化的操作?如果只是一次性导入,考虑使用SQL Server Migration Assistant for Access,这是迁移Jet/ACE到SQL Server最为通用的工具。 - David-W-Fenton
6个回答

11
为了阐述这一点,如果你选择使用 xml 方法,需要编辑 Access 转 MSSQL 的以下文件: %ProgramFiles%\Microsoft SQL Server[Your Version]\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>

并且到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中的"短文本"字段映射到MSSQL中的nvarchar数据类型。我认为它们在Access内部实际上被存储为NChar,但对于大多数情况来说,变量解决方案可能是可以的。JetToSSIS.xml然后将数据类型映射为宽字符串,就像你期望的那样。更新这些文件后,SSIS向导将正常处理这些列。


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

那也正是我的问题所在。谢谢你的回复! - TGuimond
我也遇到了“在映射文件中找不到源数据类型130”的错误,但所有列的字段长度都为50。我将它们改为51,问题得到解决。 - TFischer
太棒了,@Janet Laugel。我已经将出错的字段改为了在访问中的长文本,这样就解决了问题。 - fbarikzehy

3
我使用 SQL Server Import and Export Wizard 从 SSMS 导入数据时遇到了同样的问题。我尝试了 @Avarkx 的解决方案,但没有成功。但后来我意识到 SSMS 本身有自己版本的 JetToMSSql8.xmlJetToMSSql9.xmlJetToSSIS.xml 文件,它们位于 [SSMS_Install_Path]\Common7\IDE\CommonExtensions\Microsoft\SSIS[SQL Server version number]\MappingFiles。 当我将 @Avarkx 的解决方案应用于这些文件时,它开始正常工作,没有错误。

2

您需要编辑3个文件:

  • IBMDB2ToSSIS10.xml
  • JetToSSIS.xml
  • DtwTypeConversion.xml

复制任何类型的文本,并将源替换为130,目标替换为ntext。对我来说非常完美。


2

对于我而言,解决130问题的关键并不是字段长度超过30或更长,而是在Access 2003或更高版本中更改字段长度。(我将我的字段长度更改为100后,一些仍保留长度为50的字段仍会出现错误130,因此我将它们全部更改为100)

我认为我的问题源于从Access 97数据库复制了几张表。虽然其他表中有数百个字段长度为16,但并没有出现任何问题。


0

出现问题的字段类型为10(DAO 3.6中的文本),并且具有以下属性:

  1. 该属性应为:
  2. 使用DAO 3.6查看字段属性。类型130指的是ADO。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接