郁闷!救命!VB+MSSQL中,Select Top n的问题?

dgmichaelz 2005-02-18 03:53:28
MSSQL 2K中,需进行记录集更新!
用VB执行:select top 100 * from sms_mobile where sendflag=0后,更新记录集,sendflag=1,显示出错信息:3251 当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。
但执行:select * from sms_mobile where sendflag=0后更新记录集,sendflag=1,无任何问题。
求救!
...全文
166 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
leayh 2005-02-21
  • 打赏
  • 举报
回复
是不是你在更新的同时,别人也在修改此记录?另外,主键有没有问题?
viena 2005-02-21
  • 打赏
  • 举报
回复
记录集打开参数改一下试试啊~
dgmichaelz 2005-02-19
  • 打赏
  • 举报
回复
要是批量执行,执行SQL是很好的方法,但现在要利用读取的记录再进行其他数据集的更新,更新无误后,才进行读取记录的标志更换!
viena 2005-02-19
  • 打赏
  • 举报
回复
更新用执行SQL语句比较好
Conn.execute("update 表 set 字段=值 where 条件")
dgmichaelz 2005-02-19
  • 打赏
  • 举报
回复
楼上的老兄,你要知道记录是百万级,不是一万二万,另外是共享数据库的,资源不能长时间独占!
cosio 2005-02-19
  • 打赏
  • 举报
回复
用TIMER控件定时刷新数据库好,你看如何?
dgmichaelz 2005-02-19
  • 打赏
  • 举报
回复
'Part 2, frmMain Controls
'Timer: timerMonitor
'Button: cmdOp
'SQLConnStr,MdbConnStr in modPublic
dgmichaelz 2005-02-19
  • 打赏
  • 举报
回复
我贴源代码,目的是定时检查数据库中的表是否有新记录,有的话,将新记录进行分发,目标数据库是ACCESS表,分发的时间需时较短,不能太长,因有第三方程序读取此ACCESS表。
'Program Name: SMSMonitor
'Design: Michael Zhao, MZhao@21cn.com
'Date: 2005-02-17

'Part 1,frmMain
Private Sub cmdOp_Click(Index As Integer)
Select Case Index
Case 0
'hide
Case Else
'unload
'If MsgBox("Realy Quit?", vbYesNo + vbInformation, "Warning!") = vbNo Then
' Exit Sub
'End If
Unload Me
End Select
End Sub

Private Sub Form_Load()
With timerMonitor
.Interval = 2000
.Enabled = True
End With
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
timerMonitor.Enabled = False
If MsgBox("Realy Quit?", vbYesNo + vbInformation, "Warning!") = vbNo Then
Cancel = True
Exit Sub
End If
timerMonitor.Enabled = True
End Sub

Private Sub timerMonitor_Timer()
'MsgBox "Active"
Dim strSql As String
Dim strMdb As String
Dim cnSql As ADODB.Connection
Dim cnMdb As ADODB.Connection
Dim rsSql As ADODB.Recordset
Dim rsMdb As ADODB.Recordset
On Error Resume Next
Set cnSql = New ADODB.Connection
cnSql.Open SQLConnStr
If Err.Number <> 0 Then
Set cnSql = Nothing
Err.Clear
'MsgBox "cnSql"
Exit Sub
End If
’是这里有问题,去掉TOP 100,用全集的话,就不会更新记录时出错!
strSql = "Select Top 100 * From SMS_Send Where SendFlag='0'"
Set rsSql = New ADODB.Recordset
rsSql.Open strSql, cnSql, adOpenDynamic, adLockOptimistic
If Err.Number <> 0 Then
Set rsSql = Nothing
Set cnSql = Nothing
Err.Clear
'MsgBox "rsSql"
Exit Sub
End If
If rsSql.EOF And rsSql.BOF Then
Set rsSql = Nothing
Set cnSql = Nothing
'MsgBox "rsSql Empty!"
Exit Sub
End If
Set cnMdb = New ADODB.Connection
cnMdb.Open MDBConnStr
If Err.Number <> 0 Then
Set cnMdb = Nothing
Set rsSql = Nothing
Set cnSql = Nothing
'MsgBox Err.Number & "-" & Err.Description
Err.Clear
'MsgBox "cnMdb"
Exit Sub
End If
strMdb = "Select * from dfsdl where 1=0"
Set rsMdb = New ADODB.Recordset
rsMdb.Open strMdb, cnMdb, adOpenDynamic, adLockOptimistic
If Err.Number <> 0 Then
Set rsMdb = Nothing
Set cnMdb = Nothing
Set rsSql = Nothing
Set cnSql = Nothing
Err.Clear
'MsgBox "rsMdb"
Exit Sub
End If
Dim tmpMobile As String
Dim tmpContent As String
Dim tmpDeadTime As String
While Not rsSql.EOF
tmpMobile = rsSql.Fields("mobile").Value
tmpContent = rsSql.Fields("content").Value
tmpDeadTime = rsSql.Fields("deadtime").Value
rsSql.Fields("SendFlag").Value = 1
‘以下Update语名在查询包含TOP 100时会弹出错误
rsSql.Update
If Err.Number <> 0 Then
Set rsMdb = Nothing
Set cnMdb = Nothing
Set rsSql = Nothing
Set cnSql = Nothing
MsgBox "rsSql Update Error!" & Err.Number & "-" & Err.Description
Err.Clear
Exit Sub
End If
rsMdb.AddNew
rsMdb.Fields("mobile").Value = rsSql.Fields("mobile").Value
rsMdb.Fields("content").Value = rsSql.Fields("content").Value
rsMdb.Fields("deadtime").Value = rsSql.Fields("deadtime").Value
rsMdb.Update
If Err.Number <> 0 Then
Set rsMdb = Nothing
Set cnMdb = Nothing
Set rsSql = Nothing
Set cnSql = Nothing
MsgBox "rsMdb Update Error!"
Err.Clear
Exit Sub
End If
rsSql.MoveNext
Wend
End Sub

dgmichaelz 2005-02-19
  • 打赏
  • 举报
回复
现在就是用Timer控件刷新-timerMonitor
viena 2005-02-19
  • 打赏
  • 举报
回复
//但现在要利用读取的记录再进行其他数据集的更新,
//更新无误后,才进行读取记录的标志更换!
那也没有问题啊,可以用只读、只向前记录集,读取记录进行其他数据集的更新;
更新其他数据集后,记录下ID的范围,然后用Update语句一次更新
Tiger_Zhao 2005-02-18
  • 打赏
  • 举报
回复
那就不要用 TOP 100, 在循环中用一个记数器,记数到 100 就退出循环
dgmichaelz 2005-02-18
  • 打赏
  • 举报
回复
记录集rssql
while not rssql.eof
rssql.fields("sendflag").value=1
rssql.update
rssql.movenext
wend
Andy__Huang 2005-02-18
  • 打赏
  • 举报
回复
//select top 100 * from sms_mobile where sendflag=0后,更新记录集,

你執行更新記錄集的代碼是什麼寫的,把它帖出來吧
viena 2005-02-18
  • 打赏
  • 举报
回复
看不明白~

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧