首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请问一个VB有关问题.俺是小虾,迩是

2012-01-28 
请教一个VB问题.俺是小虾,迩是大虾!本地为ACCESS表,服务器为SQL表。打开本地数据库Set rs New ADODB.Rec

请教一个VB问题.俺是小虾,迩是大虾!
本地为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约束,不能插入重复的问题)

[解决办法]
本地为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 


[解决办法]
不能用rs.move i
[解决办法]
表HistTable22和表f1设否设置主键不同?
[解决办法]
For j = 0 To 3 Step 1 
rssql.Fields(j) = rs.Fields(j) 
Next j 
这样一条条影响速度,考虑SQL吧

[解决办法]
主键冲突与程序的有什么关系?
关键看你的数据逻辑。
1)首先,来源的数据必须保证主键唯一。
2.a)如果可能,先删除目标表的数据,再导入。
2.b)否则先导入到一个临时表中,然后从临时表导到目标表只要简单的 SQL 就能实现。
[解决办法]
ACCESS里的表HistTable22定义主键了么?
[解决办法]
作为主键的字段,它的数值是不能重复的,如果重复就会报主键冲突。

比如,如果你在服务器端的表里已经有一条记录的时间是 :#2010-01-22 16:28#,那么你如果再从HistTable22里拷贝一条具有相同SampleTime值的记录,就会报错。
[解决办法]
楼主是在向服务器表追加记录,要保证主键不唯一,需要指定选出的字段,不能简单的select * from ……
两个查询语句要对应
[解决办法]

探讨
,似乎你的程序把我的For i循环给省掉了,我这个意思是一条一条传送,记录集指针自己往下移。

For j循环只是一条记录里面的三个元素。


[解决办法]
用rs.move i
必须
每次先rs.movefirst 再rs.move i
这样很不方便
[解决办法]
还是问下楼主到底要达到什么要求,再分析下。
[解决办法]
“出现违反了Primary Key约束,不能插入重复的问题”
问题的本质是slowgrace在8楼所说。

你在写入sql数据库之前,
先要判断一下当前的记录在sql中是否存在,如果存在,则不插入(略过,或进行数据更新)。

以下代码应该可以实现你的数据非重复完全插入,但是未考虑效率,请自行优化。

VB code
本地为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 


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

探讨
作为主键的字段,它的数值是不能重复的,如果重复就会报主键冲突。

比如,如果你在服务器端的表里已经有一条记录的时间是 :#2010-01-22 16:28#,那么你如果再从HistTable22里拷贝一条具有相同SampleTime值的记录,就会报错。

热点排行