首先你采用的是什么数据库?如果用的是ORACLE等大型数据库的话,可以用PL/SQL DEVELOPER等工具调试。
检查你与数据库的连接CONNECTION有没有问题。
ADO记录集相关参数的设置,如游标、记录锁等,设置是否正确。
检查SQL语句有无不规范之处。
仔细检查你所要更新的字段的特性,包括类型、长度以及是否可以为NULL等等,然后再检查你所要插入的数据有无不符合字段特性的地方。估计问题多是出在这上面。
最后,耐心一点,会找到问题的!
祝你好运!

解决方案 »

  1.   

    使用的数据库为SQLSERVER2000, 对同样的数据进行插入时,这个错误有时出现,有时不出现。请问:是不是记录集的UpdateBatch方法不稳定呢?高版本的ADO可否避免吗?
      

  2.   

    你采用的是记录集的ADDNEW方法。这种方法我用得不多,而且绝大多数是用在断开式记录集里面。但是我觉得UpdateBatch这种方法应该是不会有问题的。ADO2.6版本也不低了,你的SQLSERVER是在本机上吗?如果在本机上,建议将游标设置为aduserclient。插入的数据充分格式化没有?如果还是不行的化,我建议用connection的execute方法,直接写SQL语句,这样速度也要快很多!我一直在线,欢迎探讨!
      

  3.   

    可以在语句前加入一个语句 就是出错语句 你可以查一下,on error next sum...的,可以查到的,这是一个内部自动化错误,你可以试一下。
      

  4.   

    插入的数据中是否有NULL?或者空值?如果字段不允许插入这些东西的话,就会出现错误。
      

  5.   

    建议使用标准SQL语句来对数据进行修改
    使用事务
      

  6.   

    Public Function InsertData(strTableName As String, strFileName As String, Temp_Cnn As ADODB.Connection) As Boolean
        Dim rs As ADODB.Recordset
        Dim fs As New FileSystemObject
        Dim fa As Object
        Dim iCol, iRow, tt As Integer
        Dim strTemp As String
        Dim strColumn As String
        Dim ado_Error As ADODB.Errors
        
        On Error GoTo err_executetable
        
        Set rs = New ADODB.Recordset
        rs.CursorType = adOpenKeyset
        rs.LockType = adLockBatchOptimistic
        rs.CursorLocation = adUseClient
        rs.Open strTableName, Temp_Cnn, , , adCmdTable
        
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set fa = fs.OpenTextFile(strFileName, ForReading)
        iRow = 0
        
        While Not fa.AtEndOfStream
            strTemp = fa.ReadLine
            rs.AddNew
            For iCol = 0 To rs.Fields.Count - 1
                If InStr(strTemp, "^") > 0 Then
                    strColumn = Left(strTemp, InStr(strTemp, "^") - 1)
                    strTemp = Right(strTemp, Len(strTemp) - InStr(strTemp, "^"))
                Else
                    strColumn = strTemp
                End If
                strColumn = Replace(strColumn, "M~V", Chr(13) & Chr(10))
                If Len(Trim(strColumn)) > 0 Then rs.Fields(iCol) = strColumn
            Next iCol
            'rs.Update
            iRow = iRow + 1
            If iRow = 1000 Then
                iRow = 0
                rs.UpdateBatch
                'rs.Update
            End If
        Wend
        If iRow > 0 Then rs.UpdateBatch
        fa.Close
        rs.Close
        InsertData = True
        Exit Function
        
    err_executetable:
        '显示并清理ADO错误
        MsgBox "处理" & strTableName & "文件时发生错误" & Err.Description, , "提示"
        MsgBox "第" & CStr(iCol) & "列,字段名为" & rs.Fields(iCol).name, , "提示"
        
        Err.Clear
        InsertData = False
    End Function请大家帮忙看看上面的代码,每次一执行rs.UpdateBatch时,就报错, "对于造型说明无效的字符值",错误号:-2147217887,请高手指教!在线等待
      

  7.   

    由于数据量很大,不能采用INSERT语句,执行效率太慢,最好能批量插入!
      

  8.   

    看了你的程序,觉得在记录集的定义、更新操作方面没有什么明显问题。总感觉问题出在If Len(Trim(strColumn)) > 0 Then rs.Fields(iCol) = strColumn,估计还是数据类型方面的问题。你应该再好好跟踪一下,重新看看表中字段的定义!
      

  9.   

    谢谢, 可是对于同一个数据文件, 同样的程序代码,有时就成功, 有时执行RS.UPDATEBATCH就失败啊。 我想不是数据文件的问题,也不是数据库结构的问题。你说呢,在帮我想想吧
      

  10.   

    注意到你程序中有两个UpdateBatch,错误是发生在哪一个UpdateBatch上?跟踪一下看!
      

  11.   

    再提一个建议,对下列语句进行修改:
    If iRow = 1000 Then
                iRow = 0
                rs.UpdateBatch
                'rs.Update
            End If
        Wend
        If iRow > 0 Then rs.UpdateBatch
    将IF iRow=...End if之间的语句都去掉,将最后一条语句中的if then也去掉,只保留rs.updatebatch试试。
      

  12.   


    把If Len(Trim(strColumn)) > 0 Then rs.Fields(iCol) = strColumn改成
    If lstrlen(Trim(strColumn)) > 0 Then rs.Fields(iCol) = trim(strColumn)试试Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
      

  13.   

    字符型长度对吗?注意你测试数据的文本长度。
    提醒:VB的UNICODE编码
      

  14.   

    呵呵!终于找到原因了, 问题就出在日期型字段的格式上,好了谢谢MZQZWH帮助,你的回复非常准确,感谢各位顶力相助,本帖是300分贴,所以决定,100分分给各位,请MZQZWH在下一张贴中, 查收200分。 谢谢!