关于数据库修改与删除的问题,请朋友帮忙,谢谢大家(在线等待)

xinshou1979330 2002-12-28 06:54:09
当我进行修改数据时,修改的都是数据库中的第一项数据,怎么回事???怎么用指针???
而当我删除数据时确把所有的数据都删除了并不是删除当前的记录.
我的整个窗体是这样设计的:
一个SSTAB控件选项卡数设置为3,分为: 添加数据 | 修改/删除数据 | 查询数据 | 这三个
我的思路是:在查询选项卡中当我单击查询数据(CommandButton)时,在MSHFLEXGRID控件中显示我所查询的数据,但同时我又将此查询的结果显示在 | 修改/删除数据 | 选项卡中的各个文本框中,在 | 修改/删除数据 | 选项卡里有 确定修改(Commandbutton),确定删除(Commandbutton),取消(Commandbutton)三个按扭
当我单击 确定修改 时进行修改,现在毛病就出现在这没当我单击 确定修改 时
修改的总是数据库中的第一项记录.而当删除时则把全部数据删除了.

请朋友告诉我一下啊???急在线等待 我将把我这两个按钮中的代码写在下面请朋友帮我 改一下谢谢,如果分数不够我可以补加.
...全文
59 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chenyu5188 2002-12-30
没有将记录指针移到你想修改记录的那条记录上

你可以用filter语句来筛选记录,找到符合条件的记录后,记录指针会自动移到那条记录上的哈。

主要是自己要多看书哈。
回复
ganzhiruogy 2002-12-30
使用Find定位到你要修改的记录上!
回复
ganzhiruogy 2002-12-30
Find 方法


搜索 Recordset 中满足指定标准的记录。如果满足标准,则记录集位置设置在找到的记录上,否则位置将设置在记录集的末尾。

语法

Find (criteria, SkipRows, searchDirection, start)

参数

criteria 字符串,包含指定用于搜索的列名、比较操作符和值的语句。

SkipRows 可选,长整型值,其默认值为零,它指定当前行或 start 书签的位移以开始搜索。

searchDirection 可选的 SearchDirectionEnum 值,指定搜索应从当前行还是下一个有效行开始。其值可为 adSearchForward 或 adSearchBackward。搜索是在记录集的开始还是末尾结束由 searchDirection 值决定。

start 可选,变体型书签,用作搜索的开始位置。

说明

criteria 中的“比较操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)、“>=”(大于或等于)、“<=”(小于或等于)、“<>”(不等于)或“like”(模式匹配)。

criteria 中的值可以是字符串、浮点数或者日期。字符串值以单引号分界(如“state = 'WA'”)。日期值以“#”(数字记号)分界(如“start_date > #7/22/97#”)。

如“比较操作符”为“like”,则字符串“值”可以包含“*”(某字符可出现一次或多次)或者“_”(某字符只出现一次)。(如“state like M_*”与 Maine 和 Massachusetts 匹配。)。
回复
laihua 2002-12-29
学到不少东西
回复
heipifeng 2002-12-29
那么多高手都写的很详细了,我就不献丑了。主要是没有指定修改那一条,默认的是第一条。
回复
zqfleaf 2002-12-29
上面我说了,你还要做一个记录集指针移动的。
回复
zqfleaf 2002-12-29
Private Sub Command4_Click()
Dim cnn As ADODB.Connection
'Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
sql = "delete * from information where 字段名2='" & PubKeyCarNo & "'"
If MsgBox("真的要删除??", vbYesNo) = vbYes Then
cnn.Execute sql
MsgBox "OK"
End If


'Set rs = New ADODB.Recordset

'rs.Open sql, cnn, adOpenKeyset, adLockOptimistic

'Adodc1.Recordset.Delete

'If Adodc1.Recordset.Fields(0) = Trim(Text20.Text) And Adodc1.Recordset.Fields(1) = Trim(Combo2.Text) And Adodc1.Recordset.Fields(2) = Trim(Text19.Text) And Adodc1.Recordset.Fields(3) = Trim(Text18.Text) And Adodc1.Recordset.Fields(4) = Trim(Text17.Text) And Adodc1.Recordset.Fields(5) = Trim(Text16.Text) And Adodc1.Recordset.Fields(6) = Trim(Text15.Text) And Adodc1.Recordset.Fields(7) = Format(Trim(Text14.Text)) And Adodc1.Recordset.Fields(8) = Trim(Text13.Text) And Adodc1.Recordset.Fields(9) = Trim(Text12.Text) And Adodc1.Recordset.Fields(10) = Trim(Text11.Text) Then

'Adodc1.Recordset.Delete

'rs.Close



'End If



End Sub
回复
zqfleaf 2002-12-29
Private Sub Command5_Click()
'------------------------------------------------------------------------
' 说明:从理论上来讲车牌号是唯一的我不知道旧车是什么情况,在车厂,
' 车架与发动机号都是可以改的我建议你用车牌号作为唯一的主键,
' 当然主键也是可以改的,所以你先要定一个全局变量PubKeyCarNo
' 来保存车牌号,当rs的记录指针改变的时候给他赋值。
'------------------------------------------------------------------------
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
If Trim(Text20.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text20.SetFocus
Exit Sub
End If
If Trim(Combo2.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Combo2.SetFocus
Exit Sub
End If
If Trim(Text19.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text19.SetFocus
Exit Sub

End If
If Trim(Text18.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text18.SetFocus
Exit Sub

End If
If Trim(Text17.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text17.SetFocus
Exit Sub

End If
If Trim(Text16.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text16.SetFocus
Exit Sub
End If
If Trim(Text15.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text15.SetFocus
Exit Sub
End If
If Trim(Text14.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text14.SetFocus
Exit Sub
End If
If Trim(Text13.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text13.SetFocus
Exit Sub
End If
If Trim(Text12.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text12.SetFocus
Exit Sub
End If
If Trim(Text11.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text11.SetFocus
Exit Sub
End If
'------------------------------------------------------------------------------------
' 说明:由于我不知道你的字段名与字段类型,请按下面格式改写,如果是数值型,不要加分号
' 如果是boolean型的也不加
'-------------------------------------------------------------------------------------
sql = " update information set 字段名0='" & Trim(Text20.Text) & _
"',字段名1='" & Trim(Combo2.Text) & _
"',字段名2='" & Trim(Text19.Text) & _
"',字段名3='" & Trim(Text18.Text) & _
"',字段名4='" & Trim(Text17.Text) & _
"',字段名5='" & Trim(Text16.Text) & _
"',字段名6='" & Trim(Text15.Text) & _
"',字段名7='" & Format(Trim(Text14.Text), "yyyy-mm-dd") & _
"',字段名8='" & Trim(Text13.Text) & _
"',字段名9='" & Trim(Text12.Text) & _
"',字段名10='" & Trim(Text11.Text) & _
" where 字段2='" & PubKeyCarNo & "'"
cnn.Execute sql
'sql = "select*from information"
'Set rs = New ADODB.Recordset
'rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
'rs.Fields(0) = Trim(Text20.Text)
'rs.Fields(1) = Trim(Combo2.Text)
'rs.Fields(2) = Trim(Text19.Text)
'rs.Fields(3) = Trim(Text18.Text)
'rs.Fields(4) = Trim(Text17.Text)
'rs.Fields(5) = Trim(Text16.Text)
'rs.Fields(6) = Trim(Text15.Text)
'rs.Fields(7) = Format(Trim(Text14.Text), "yyyy-mm-dd")
'rs.Fields(8) = Trim(Text13.Text)
'rs.Fields(9) = Trim(Text12.Text)
'rs.Fields(10) = Trim(Text11.Text)
'rs.Update
MsgBox "恭喜、恭喜,您已经成功修改数据。谢谢合作~!~", vbOKOnly + vbExclamation, "修改成功"
'rs.Bookmark = mark

Text20.Text = ""
Combo2.Text = ""
Text19.Text = ""
Text18.Text = ""
Text17.Text = ""
Text16.Text = ""
Text15.Text = ""
Text14.Text = ""
Text13.Text = ""
Text12.Text = ""
Text11.Text = ""

'rs.Close
End Sub
回复
zqfleaf 2002-12-28
首先,你在把在查询中如何把内容传到修改页中,我想你肯定用数据绑定,那么这个建议你有一个KEY主键,这个是唯一,且不能改,假设为text1
'----------------------------------------
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String

Set cnn = createobject("ADODB.Connection")
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
'------------在这里加入你的一大堆判断-------------
sql="update table set field2='" & text2.text & "' , .......where field1='"& Text1.text & "'"
cnn.execute sql
cnn.close
set cnn=nothing
如果是删除,把sql改成
sql = "delete from information where field1='" & text20.text &"'"


回复
of123 2002-12-28
你的问题出在这几句上。等于你重新打开了一个记录集,与你显示在MSHFLEXGRID中的不相干。
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"

sql = "select*from information"
Set rs = New ADODB.Recordset
rs.Open sql, cnn, adOpenKeyset, adLockOptimistic

解决办法:
在窗体的通用部分声明连接和记录集,在form_load中打开。各个事件中始终处理同一个记录集。也就是去掉上面6行。
如果你的MSHFLEXGRID是与ADODC绑定的,则省去这些东西:
with adodc1.recordset
.Fields(0) = Trim(Text20.Text)
.Fields(1) = Trim(Combo2.Text)
.......
.Update
end with
回复
of123 2002-12-28
搂主,能否看看你的代码?
回复
zqfleaf 2002-12-28
mousean(幻想无限)说的很详细,
你应该 还有四个按钮来移动记录的指针的
首条,rs.movefirst
下一条,rs.movenext
上一条 rs.movepiror
未条,rs.movelast
回复
mouseanAnya 2002-12-28
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
Set rs = New ADODB.Recordset
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
sql = "delete from information where field1='" & text20.text &"'"

rs.Open sql, cnn, adOpenKeyset, adLockOptimistic

'ADODC 重新查询一次
Adodc1.Recordset.Requery
'#################################################
注意这儿的field1 是你表中的一个字段名,它的值是text20的内容;确保这个值不会改变;如果你表中有ID字段最好使用这个字段作为where 语句的条件

如果还有不明白的地方就提出来,我会进一步说明
回复
mouseanAnya 2002-12-28
修改操作,将其中的判断输入框是否为空部分分离出来,写成boolean型函数
清空输入框写成过程,这样可以使修改按钮的代码清晰一些
Private Sub Command1_Click()

Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String

'调用判断函数,看是不是有输入框没有输入,函数为真退出当前过程,为假则所有输入框都有内容,继续执行
If JudgEmpty = True Then Exit Sub

'错误处理,当遇到异常时,程序转至 标签 errha 处处理
On Error GoTo errha:
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"

Set rs = New ADODB.Recordset
sql = "select * from information where field1='" & Trim(text20) & "'"

rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
If Not (rs.BOF Or rs.EOF) Then
rs.Update
rs.Fields(0) = Trim(text20.Text)
rs.Fields(1) = Trim(Combo2.Text)
rs.Fields(2) = Trim(Text19.Text)
rs.Fields(3) = Trim(Text18.Text)
rs.Fields(4) = Trim(Text17.Text)
rs.Fields(5) = Trim(Text16.Text)
rs.Fields(6) = Trim(Text15.Text)
rs.Fields(7) = Format(Trim(Text14.Text), "yyyy-mm-dd")
rs.Fields(8) = Trim(Text13.Text)
rs.Fields(9) = Trim(Text12.Text)
rs.Fields(10) = Trim(Text11.Text)
rs.Update

MsgBox "恭喜、恭喜,您已经成功修改数据。谢谢合作~!~", vbOKOnly + vbExclamation, "修改成功"

rs.Bookmark = mark

'调用清空输入框的过程
Call ClearTxt

End If
rs.Close

Exit Sub
errha:
MsgBox Err.Description, vbInformation, "错误"
End Sub
'**************************************************************
''调用清空输入框的过程
Private Sub ClearTxt()
text20.Text = ""
Combo2.Text = ""
Text19.Text = ""
Text18.Text = ""
Text17.Text = ""
Text16.Text = ""
Text15.Text = ""
Text14.Text = ""
Text13.Text = ""
Text12.Text = ""
Text11.Text = ""

End Sub
'''*****************************************************************
'''判断函数
Private Function JudgEmpty() As Boolean

JudgEmpty = False '初始函数值为假

If Trim(text20.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
text20.SetFocus
JudgEmpty = True '输入框内容为空则为真,跳出函数

Exit Function
End If
If Trim(Combo2.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Combo2.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text19.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text19.SetFocus
JudgEmpty = True
Exit Function

End If
If Trim(Text18.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text18.SetFocus
JudgEmpty = True

Exit Function

End If
If Trim(Text17.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text17.SetFocus
JudgEmpty = True
Exit Function

End If
If Trim(Text16.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text16.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text15.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text15.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text14.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text14.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text13.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text13.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text12.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text12.SetFocus
JudgEmpty = True
Exit Function
End If
If Trim(Text11.Text) = "" Then
MsgBox "想修改还不写新的数据,你玩我啊~!~???~", vbOKOnly + vbExclamation, "注意"
Text11.SetFocus
JudgEmpty = True
Exit Function
End If
End Function

回复
mouseanAnya 2002-12-28
谢谢。
一般提取数据库中的记录时,指针默认停留在记录集的第一条,所以,你更新记录时,没有指定真正想要更新的记录,那么这样操作,永远只是修改第一条记录。
而删除操作时,如果同样不指明条件,删除语句则删除所有的记录。

你的代码有点乱,同时使用数据控件跟定义的记录集,我帮你整理一下,等会儿贴给你。
回复
xinshou1979330 2002-12-28
up
回复
mouseanAnya 2002-12-28
修改的时候也是没有使用where 语句指定更新记录的条件
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
sql = "update information set field2='" & text2 & "' ,field3='" & text3 & "' where field1='" & text1 & "' "

Set rs = New ADODB.Recordset

rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
回复
mouseanAnya 2002-12-28
在删除按钮中,你是先把所有的数据提取出来,之后的代码没有指定具体要删除的记录,所以才会把所有提取出来的记录删除

如果是删除选中的记录,
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
sql = "delete from information where field1='" & text1.text &"'"

Set rs = New ADODB.Recordset

rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
回复
mouseanAnya 2002-12-28
你的问题出记录指针在没有移动到需要操作位置
回复
xinshou1979330 2002-12-28
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jkxt"
sql = "select*from information"

Set rs = New ADODB.Recordset

rs.Open sql, cnn, adOpenKeyset, adLockOptimistic

Adodc1.Recordset.Delete

If Adodc1.Recordset.Fields(0) = Trim(Text20.Text) And Adodc1.Recordset.Fields(1) = Trim(Combo2.Text) And Adodc1.Recordset.Fields(2) = Trim(Text19.Text) And Adodc1.Recordset.Fields(3) = Trim(Text18.Text) And Adodc1.Recordset.Fields(4) = Trim(Text17.Text) And Adodc1.Recordset.Fields(5) = Trim(Text16.Text) And Adodc1.Recordset.Fields(6) = Trim(Text15.Text) And Adodc1.Recordset.Fields(7) = Format(Trim(Text14.Text)) And Adodc1.Recordset.Fields(8) = Trim(Text13.Text) And Adodc1.Recordset.Fields(9) = Trim(Text12.Text) And Adodc1.Recordset.Fields(10) = Trim(Text11.Text) Then

Adodc1.Recordset.Delete

rs.Close

这是删除按钮中的代码
回复
加载更多回复
相关推荐
发帖

1187

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2002-12-28 06:54
社区公告
暂无公告