本地为ACCESS表,服务器为SQL表。
'打开本地数据库 
   Set rs = New ADODB.Recordset
      sql = "select * from HistTable22"
           
      rs.Open sql, cn, adOpenStatic, adLockOptimistic
      rs.MoveFirst
               
 '打开服务器数据库
   Set rssql = New ADODB.Recordset
      str = "SELECT * FROM f1" 
      rssql.Open str, cnnsql, adOpenDynamic, adLockOptimistic
       
      For i = 1 To rs.RecordCount Step 1 
        rssql.AddNew
          For j = 0 To 3 Step 1
            rssql.Fields(j) = rs.Fields(j)
          Next j
        rssql.Update        rs.Move i
      Next i请大虾们对照上面程序,假设rs记录集有100条记录,俺问的是:用rs.move i 或rs.movenext为什么不能让rs记录自己往下移,逐条传到服务器表中呢?(目前故障现象:在传送了第一条记录后,传送第二条记录运行到rssql.update时出现违反了Primary Key约束,不能插入重复的问题)

解决方案 »

  1.   

    本地为ACCESS表,服务器为SQL表。 
    '打开本地数据库 
      Set rs = New ADODB.Recordset 
          sql = "select * from HistTable22" 
              
          rs.Open sql, cn, adOpenStatic, adLockOptimistic 
          rs.MoveFirst 
                  
    '打开服务器数据库 
      Set rssql = New ADODB.Recordset 
          str = "SELECT * FROM f1" 
          rssql.Open str, cnnsql, adOpenDynamic, adLockOptimistic 
          
          
          while not rs.eof
            rssql.AddNew 
              For j = 0 To 3 Step 1 
                rssql.Fields(j) = rs.Fields(j) 
              Next j 
            rssql.Update         rs.Movenext
          wend 
      

  2.   

    表HistTable22和表f1设否设置主键不同?
      

  3.   

              For j = 0 To 3 Step 1 
                rssql.Fields(j) = rs.Fields(j) 
              Next j 
    这样一条条影响速度,考虑SQL吧
      

  4.   

    主键冲突与程序的有什么关系?
    关键看你的数据逻辑。
    1)首先,来源的数据必须保证主键唯一。
    2.a)如果可能,先删除目标表的数据,再导入。
    2.b)否则先导入到一个临时表中,然后从临时表导到目标表只要简单的 SQL 就能实现。
      

  5.   

    ACCESS里的表HistTable22定义主键了么?
      

  6.   

    来源数据,即表HistTable22设置了和服务器f1同样的主键--SampleTime(日期/时间 格式)jhone99 大哥:用rs.movenext 试过,只能传送一条,传送第二条时同样主键冲突,似乎你的程序把我的For i循环给省掉了,我这个意思是一条一条传送,记录集指针自己往下移。For j循环只是一条记录里面的三个元素。谢谢。。希望能进一步解答疑惑!
      

  7.   

    作为主键的字段,它的数值是不能重复的,如果重复就会报主键冲突。比如,如果你在服务器端的表里已经有一条记录的时间是 :#2010-01-22 16:28#,那么你如果再从HistTable22里拷贝一条具有相同SampleTime值的记录,就会报错。
      

  8.   

    楼主是在向服务器表追加记录,要保证主键不唯一,需要指定选出的字段,不能简单的select * from ……
    两个查询语句要对应
      

  9.   

    用rs.move i
    必须
    每次先rs.movefirst 再rs.move i
    这样很不方便
      

  10.   

    出现违反了Primary Key约束,不能插入重复的问题
    问题的本质是slowgrace在8楼所说。你在写入sql数据库之前,
    先要判断一下当前的记录在sql中是否存在,如果存在,则不插入(略过,或进行数据更新)。以下代码应该可以实现你的数据非重复完全插入,但是未考虑效率,请自行优化。本地为ACCESS表,服务器为SQL表。 
    '打开本地数据库 
      Set rs = New ADODB.Recordset 
          sql = "select * from HistTable22" 
              
          rs.Open sql, cn, adOpenStatic, adLockOptimistic 
          rs.MoveFirst 
                  
    '打开服务器数据库 
      Set rssql = New ADODB.Recordset 
          while not rs.eof 
           str = "SELECT * FROM f1 Where 主键字段=" & rs("对应字段") 
           rssql.Open str, cnnsql, adOpenDynamic, adLockOptimistic 
           If rssql.Eof Then
             rssql.AddNew 
              For j = 0 To 3 Step 1 
                rssql.Fields(j) = rs.Fields(j) 
              Next j 
              rssql.Update         
            End If
    rssql.Close
            rs.Movenext 
          wend 
      

  11.   

    还是看看你自己的sqlserver构架吧,主键列中插入的值有重复的,才会报这个错误。
      

  12.   

    这个解释是正确的,如果你需要无条件导入,可以在sql里面建立一个新的列把access里面的主键那个列倒入到新建的列中