表设计
如何解决导出DBF时“字段将不能置于记录中”错误?记录过大错误
2008-11-25 09:31:59
题:
  如何解决导出DBF时“字段将不能置于记录中”错误?

 

 

 

回答:  

  access表的文字字段总长度应小于3900(2007中估算)个字节。

 

以前有人提问在设计表或者更改表的时候提示“记录过大”,原因:access 2003 及以前对文字字段总长度有2000个字符数的限制,所以不要在一个表中创建太多文字字段。 access 2007 当字段的 UnicodeCompression 属性设置为“是”时记录中的字符个数(除“备注”和“OLE 对象”字段外)为4000以下。

 

'=========================================================== ' 过程及函数名:  RaiseError ' 版本号      :  -- ' 说明        :  本示例演示怎样会发生“字段将不能置于记录中”错误 '                 access导出到DBF时提示“字段将不能置于记录中。” '                 引起上述错误的原因可能是access表的字段中文本字段 '                 太多,造成总长度超过 DBF 限制。 '                 解决方案是减少字段总长度,或者分多个DBF导出,在 '                 FoxPro 中再进行组合。 ' 测试环境    :  win2003+office2007 chs ' 引用        :  -- ' 输入参数    :  -- ' 输出值      :  -- ' 返回值      :  -- ' 调用演示    :  RaiseError '                 按 Alt+F11 转到VBE界面,菜单->插入->模块 '                 将下列代码赋值粘贴进模块,将光标停放(单击)在 '                 Function RaiseError 这行上,然后按F5键运行看效果 ' 最后修改日期:  2008-10-26 11:59:00 ' 示例地址    :  http://access911.net/?kbid;72FABF1E13DCE7F3 ' 作者        :  cg1 ' 电子邮件    :  access911@gmail.com ' 版权        :  作者保留一切权力, '                 请在公布本代码时将本段说明一起公布,谢谢! '=========================================================== Function RaiseError()

 

    Dim strSql As String     Dim strFields As String     Dim i As Long               For i = 1 To 40         strFields = strFields & ", f" & i & " text(250)"     Next          DropTable "test_temp"          strSql = "create table test_temp (f0 text(250) " & strFields & " )"     CurrentProject.Connection.Execute strSql          '以下这行将提示错误“字段将不能置于记录中”。     DoCmd.TransferDatabase acExport, "dBase 5.0", CurrentProject.Path, acTable, "test_temp", "aaa.dbf"          '将每个文本字段的字段长度尽量减少即可解决问题,或者分多次导出到多个 DBF ,每次只导出几个字段,也可以。           End Function

Function DropTable(ByVal TableName) On Error Resume Next     Dim strSql As String     strSql = "drop table " & TableName     CurrentProject.Connection.Execute strSql End Function

 

 

 

 

 

'=========================================================== ' 过程及函数名:  TestFieldsLenCountLimit ' 版本号      :  -- ' 说明        :  测试总长度达到多少时会出错。测试结果是一般为3900-4000 ' 测试环境    :  win2003+office2007 chs ' 引用        :  -- ' 输入参数    :  -- ' 输出值      :  -- ' 返回值      :  -- ' 调用演示    :  TestFieldsLenCountLimit '                 按 Alt+F11 转到VBE界面,菜单->插入->模块 '                 将下列代码赋值粘贴进模块,将光标停放(单击)在 '                 TestFieldsLenCountLimit 这行上,然后按F5键运行看效果 ' 最后修改日期:  2008-10-26 11:59:00 ' 示例地址    :  http://access911.net/?kbid;72FABF1E13DCE7F3 ' 作者        :  cg1 ' 电子邮件    :  access911@gmail.com ' 版权        :  作者保留一切权力, '                 请在公布本代码时将本段说明一起公布,谢谢! '=========================================================== Function TestFieldsLenCountLimit()     Dim i As Long     Dim lngFieldSize As Long     Dim lngStart As Long     lngStart = 235     lngFieldSize = 16          For i = lngStart To 255         Debug.Print "正在测试" & i & "个字段"         DoEvents         If RaiseError1(i, lngFieldSize) = True Then             Debug.Print i, "测试长度:" & i * lngFieldSize             Exit For         End If     Next End Function

 

Private Function RaiseError1(ByVal fields As Long, ByVal TextLength As Long) As Boolean

    Dim strSql As String     Dim strFields As String     Dim i As Long On Error GoTo RaiseError1_Err          For i = 1 To fields         strFields = strFields & ", f" & i & " text(" & TextLength & ")"     Next          DropTable "test_temp"          strSql = "create table test_temp (f0 long " & strFields & " )"     Debug.Print strSql     CurrentProject.Connection.Execute strSql          '以下这行将提示错误“字段将不能置于记录中”。     DoCmd.TransferDatabase acExport, "dBase 5.0", CurrentProject.Path, acTable, "test_temp", "aaa.dbf"          '将每个文本字段的字段长度尽量减少即可解决问题,或者分多次导出到多个 DBF ,每次只导出几个字段,也可以。               Exit Function RaiseError1_Err:     Select Case Err.Number     Case 0          Case 3016         RaiseError1 = True     Case Else         MsgBox Err.Number & Err.Description     End Select           End Function