Me.Adodc1.Recordset.Update出现报错-----(改变在通知期间取消;没有列改变)---为被更新

yuanhaili 2000-07-17 09:25:00
关于adodc 和textbox的捆绑的小问题!
'用me.Adodc1.Recordset.Update方法时,修改某个字段时并不为空时,可以update!但为空时,则会报出以下错误:
'(改变在通知期间取消;没有列改变)---未被更新

原代码如下:

Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
Dim i As Integer
Me.Adodc1.Recordset.Update '
'出现报错-----(改变在通知期间取消;没有列改变)---为被更新
Me.Adodc1.Refresh
End Sub

Private Sub Form_Load()
Dim i As Integer
For i = 0 To Me.Adodc1.Recordset.Fields.Count - 1
If i <> 0 Then
Load Me.Text1(i)
End If
Me.Text1(i).DataField = Me.Adodc1.Recordset.Fields(i).Name
Me.Text1(i).Visible = True
If i <> 0 Then
Me.Text1(i).Top = Me.Text1(i - 1).Top + 1.5 * Me.Text1(0).Height
End If
Next i
End Sub
...全文
482 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
老大,我只是一个程序员,不是总体设计人员!这是头的意思,你让我怎么办?
liyang 2000-07-17
  • 打赏
  • 举报
回复
老大,你为什么要用没有值来表示呢?可以用-1表示。因为字段没有值不好控制。如果程序好改,我觉得你还是改一下
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
我的意思是如果某个字段中用1~n和没有值来代表不同的意思!我就是要让此字段没有值,并不是为0的情况,怎么办?
liyang 2000-07-17
  • 打赏
  • 举报
回复
不能为0,可以是什么?或者:command1_click
if checkNull=0 then
...
end if
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
case adLong,adSmallInt...所有数字型
if trim(txtTemp.text)="" then
CheckNull=0 '问题就出在这里,我不能让他为0
else
checknull=trim(txtTemp.text)
endif
liyang 2000-07-17
  • 打赏
  • 举报
回复
你可以写这样一个函数:
private function CheckNull(astTemp as Adodb.recordset,fldTemp as string,txtTemp as object)
select astTemp(fldTemp).type
case adVarChar...所有字符型
if trim(txtTemp.text)="" then
CheckNull=""
else
checknull=trim(txtTemp.text)
endif
case adLong,adSmallInt...所有数字型
if trim(txtTemp.text)="" then
CheckNull=0
else
checknull=trim(txtTemp.text)
endif
case ...所有你想检查的类型
end select
end function

然后在command1_click中在做update前,写text1.text=checknull(text1.datasource.recordset,text1.datafield,text1)

yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
我知道这个可是properties中的那个呀?老大,另外字符型的字段可以,数字型的怎么办?
liyang 2000-07-17
  • 打赏
  • 举报
回复
应该可以。可以看field对象的properties集合。中间应该有这个属性。
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
那么该属性可以用ado对象来设置吗?
liyang 2000-07-17
  • 打赏
  • 举报
回复
oracle的字符字段也应该有这种属性吧?
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
我的数据库是oracle数据库,
liyang 2000-07-17
  • 打赏
  • 举报
回复
你的数据库是什么?如果是mdb,那你看看字符型字段的定义,mdb字符型字段缺省不能为empty.你把"允许空字符串"设为true,即可。
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
我钦佩你的聪慧!可这样我以后就没办法判断该字段是否为空了,还有字符型的可以勉强这样处理,可数字型的呢?,我不能让他为0吧,这样我的判断久混乱了!
liyang 2000-07-17
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
Dim i As Integer

if Trim(Text1.text)="" then
text1.text="" 不行的话 Text1.text=" "
end if
Me.Adodc1.Recordset.Update '
'出现报错-----(改变在通知期间取消;没有列改变)---为被更新
Me.Adodc1.Refresh
End Sub

yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
老大,你作个例子是一下好吗?
我的操作是把某个text框中的值删掉,在更新就报错了!
liyang 2000-07-17
  • 打赏
  • 举报
回复
不是。当text为空时,得到的不是NULL。你可以判断一下,如果Trim(text.text)=""
让text.text="",就可以。
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
我的问题补充:是指text1.text为空而且相应的数据库字段可以为空--而出现错误!
liyang 2000-07-17
  • 打赏
  • 举报
回复
"为空时"是什么意思?是不是text的内容为空。如果是,那要检查数据库相应字段是否可以为空字串。
yuanhaili 2000-07-17
  • 打赏
  • 举报
回复
老大,我找了老半天,可找出来的属性值没什么有用的呀?您的意思是找什么属性呀?
liyang 2000-07-17
  • 打赏
  • 举报
回复
那你还是找field的properties.这样:for i=0 to text1.datasource.recordset(text1.datafield).properties.count-1
debug.print text1.datasource.recordset(text1.datafield).properties(i).name &" " text1.datasource.recordset(text1.datafield).properties(i).value
next i
先把properties的名字和值打出来看了再找。
4.设计体会 通过本次课程设计,使我从更深的层次了解了VB的设计技巧和应用方法。在程序的编制和调试过程中,我从中学到了很多有用的方法,比如通过本次设计,我更深刻的体会到了VB系统的方便与实用。在课程设计的过程中,我对课本上的知识进行了复习,从中找出了不少盲点,由衷地感觉到学习过程中应该把学的知识作扎实,多动手多思考,这样才能最大限度的减少知识的漏洞。 把课本上的东西变成实际的东西,让其有使用的价值,是一件很让人高兴的事。我切实的体会到VB这门课程是有用处的,它解释了我平时学习中的很多疑惑,让我增长了很多见识。 5.参考文献 [1] 刘天惠.Visual Basic程序设计教程[M]. 北京: 清华大学大学出版社,2003.12-24 [2] 龚沛曾.Visual Basic程序设计教程[M]. 高等教育出版社, 2004.28-45 [3] 蒋加伏.Visual Basic程序设计教程[M].北京: 北京邮电大学出版社,2003.10-56 [4] Microsoft .Visual Basic 6.0 中文版控件大全[M]北京:电子工业出版社,2004.15-23 6.附录 源程序代码如下: (1)用户登录窗体 Private Sub cmdOK_Click() Dim SQL As String Dim rs As ADODB.Recordset 沈 阳 大 学 课程设计说明书 NO.16 If Trim(UserName.Text = "") Then MsgBox "没有输入用户名称,请重新输入!", vbOKOnly + vbExclamation, "警告" UserName.SetFocus Else '查询用户 SQL = "select * from UserInfo where UserID='" & UserName.Text & "'" Set rs = TransactSQL(SQL) If iflag = 1 Then If rs.EOF = True Then MsgBox "没有这个用户,请重新输入!", vbOKOnly + vbExclamation, "警告" UserName.SetFocus Else If Trim(rs.Fields(1)) = Trim(PassWord.Text) Then rs.Close Me.Hide gUserName = Trim(UserName.Text) '保存用户名称 FrmMain.Show Unload Me Else MsgBox "密码不正确,请重新输入!", vbOKOnly + vbExclamation, "警告" PassWord.SetFocus PassWord.Text = "" 沈 阳 大 学 课程设计说明书 NO.17 End If End If Else Unload Me End If End If pwdCount = pwdCount + 1 '判断输入次数 If pwdCount = 3 Then Unload Me Exit Sub End If End Sub Private Sub Form_Load() pwdCount = 0 gUserName = "" End Sub Private Sub PassWord_KeyDown(KeyCode As Integer, Shift As Integer) TabToEnter KeyCode End Sub Private Sub UserName_KeyDown(KeyCode As Integer, Shift As Integer) TabToEnter KeyCode End Sub 沈 阳 大 学 课程设计说明书 NO.18 (2)添加用户窗体 Option Explicit Public str1 As String '保存修改时的SQL语句 Public ID As Integer '保存记录编号 Private baddflag As Boolean rivate Sub AID_KeyDown(KeyCode As Integer, Shift As Integer) TabToEnter KeyCode End Sub Private Sub AID_LostFocus() Dim SQL As String Dim rs As New ADODB.Recordset SQL = "select SName,SDept,SPosition from StuffInfo where SID='" & Me.AID.Text & "'" Set rs = TransactSQL(SQL) If rs.EOF = False Then Me.AName = rs(0) '初始化员工姓名 Me.AOldDept = rs(1) Me.AOldPosition = rs(2) Else MsgBox "员工编号输入错误,或者没有这个员工!", vbOKOnly + vbExclamation, "警告!" Me.AID = "" Me.AID.SetFocus Me.AID.ListIndex = 0 End If rs.Close End Sub 沈 阳 大 学 课程设计说明书 NO.19 Private Sub cmdCancel_Click() Unload Me Exit Sub End Sub rivate Sub checkinput() If Me.ANewPosition = "" Then MsgBox "请输入新的职务!", vbOKOnly + vbExclamation, "警告!" Me.ANewPosition.SetFocus ElseIf Me.AOutTime = "" Or IsDate(Me.AOutTime) = False Then MsgBox "请输入正确的调出时间!", vbOKOnly + vbExclamation, "警告!" Me.AOutTime = "" Me.AOutTime.SetFocus ElseIf Me.AInTime = "" Or IsDate(Me.AInTime) = False Then MsgBox "请输入正确的调入时间!", vbOKOnly + vbExclamation, "警告!" Me.AInTime = "" Me.AInTime.SetFocus Else baddflag = True End If End Sub Private Sub cmdOK_Click() Dim SQL As String Dim rs As New ADODB.Recordset 沈 阳 大 学 课程设计说明书 NO.20 baddflag = False Call checkinput If baddflag = True Then If flag = 1 Then 'Call checkinput SQL = "select * from AlterationInfo" Set rs = TransactSQL(SQL) rs.AddNew rs.Fields(1) = Me.AID rs.Fields(2) = Me.AName rs.Fields(3) = Me.AOldDept rs.Fields(4) = Me.ANewDept rs.Fields(5) = Me.AOldPosition rs.Fields(6) = Me.ANewPosition rs.Fields(7) = Me.AOutTime rs.Fields(8) = Me.AInTime rs.Fields(9) = Me.ARemark rs.Update rs.Close SQL = "update StuffInfo set SDept='" & Me.ANewDept & "', SPosition='" SQL = SQL & Me.ANewPosition & "' where SID='" & Me.AID & "'" TransactSQL (SQL) MsgBox "已经添加调动信息!", vbOKOnly + vbExclamation, "添加结果!" SQL = "select * from AlterationInfo order by ID" 沈 阳 大 学 课程设计说明书 NO.21 frmAlterationResult.Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\Person.mdb" frmAlterationResult.Adodc1.RecordSource = SQL If SQL <> "" Then frmAlterationResult.Adodc1.Refresh End If Else '修改记录 'Call checkinput SQL = "update StuffInfo set SDept='" & Me.ANewDept & "', SPosition='" SQL = SQL & Me.ANewPosition & "' where SID='" & Me.AID & "'" TransactSQL (SQL) SQL = "update AlterationInfo set AOldDept='" & Me.AOldDept & "',ANewDept='" SQL = SQL & Me.ANewDept & "',AOldPosition='" & Me.AOldPosition SQL = SQL & "',ANewPosition='" & Me.ANewPosition & "',AOutTime=#" & Me.AOutTime SQL = SQL & "#,AInTime=#" & Me.AInTime & "# where ID=" & ID TransactSQL (SQL) MsgBox "已经修改信息!", vbOKOnly + vbExclamation, "修改结果!" Unload Me SQL = "select * from AlterationInfo order by ID" frmAlterationResult.Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\Person.mdb" frmAlterationResult.Adodc1.RecordSource = SQL If SQL <> "" Then frmAlterationResult.Adodc1.Refresh End If 沈 阳 大 学 课程设计说明书 NO.22 Set frmAlterationResult.DataGrid1.DataSource = frmAlterationResult.Adodc1.Recordset frmAlterationResult.DataGrid1.Refresh frmAlterationResult.Show frmAlterationResult.ZOrder 0 Call init Me.ZOrder 0 End If End If End Sub (3)查询员工信息窗体 Option Explicit Private query As String Private fromdate As String Private todate As String Private Sub cmdCancel_Click() Unload Me Exit Sub End Sub Private Sub CombineDate() fromdate = Me.FromYear.Text & "-" & Me.FromMonth.Text & "-1" fromdate = Format(Me.FromYear.Text & "-" & Me.FromMonth.Text & "-1", "yyyy-mm-dd") todate = Me.ToYear.Text & "-" & Me.ToMonth.Text & "-1" todate = Format(todate, "yyyy-mm-dd") End Sub 沈 阳 大 学 课程设计说明书 NO.23 Private Sub setSQL() If IDCheck.Value = vbChecked Then query = "select * from StuffInfo where SID='" & Trim(Me.SID) & "'" End If If NameCheck.Value = vbChecked Then query = "select * from StuffInfo where SName='" & Trim(Me.SName) & "'" End If End Sub Private Sub cmdOK_Click() Call CombineDate Call setSQL frmResult.createList (query) frmResult.Show Unload Me End Sub Private Sub Form_Load() Dim i As Integer Dim SQL As String Dim rs As New ADODB.Recordset SQL = "select distinct datepart(yy,SInTime) from StuffInfo" Set rs = TransactSQL(SQL) If Not rs.EOF Then rs.MoveFirst While Not rs.EOF If Not IsNull(rs.Fields(0)) Then 沈 阳 大 学 课程设计说明书 NO.24 Me.FromYear.AddItem rs(0) Me.ToYear.AddItem rs(0) End If rs.MoveNext Wend rs.Close Me.FromYear.ListIndex = 0 Me.ToYear.ListIndex = 0 End If For i = 1 To 12 Me.FromMonth.AddItem i Me.ToMonth.AddItem i Next i Me.FromMonth.ListIndex = 0 Me.ToMonth.ListIndex = 0 End Sub

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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